@strapi/data-transfer 5.12.1 → 5.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/engine/errors.js +39 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/errors.mjs +34 -0
- package/dist/engine/errors.mjs.map +1 -0
- package/dist/engine/index.js +797 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/index.mjs +792 -0
- package/dist/engine/index.mjs.map +1 -0
- package/dist/engine/validation/provider.js +19 -0
- package/dist/engine/validation/provider.js.map +1 -0
- package/dist/engine/validation/provider.mjs +17 -0
- package/dist/engine/validation/provider.mjs.map +1 -0
- package/dist/engine/validation/schemas/index.js +57 -0
- package/dist/engine/validation/schemas/index.js.map +1 -0
- package/dist/engine/validation/schemas/index.mjs +55 -0
- package/dist/engine/validation/schemas/index.mjs.map +1 -0
- package/dist/errors/base.js +13 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/base.mjs +11 -0
- package/dist/errors/base.mjs.map +1 -0
- package/dist/errors/constants.js +10 -0
- package/dist/errors/constants.js.map +1 -0
- package/dist/errors/constants.mjs +8 -0
- package/dist/errors/constants.mjs.map +1 -0
- package/dist/errors/providers.js +41 -0
- package/dist/errors/providers.js.map +1 -0
- package/dist/errors/providers.mjs +36 -0
- package/dist/errors/providers.mjs.map +1 -0
- package/dist/file/index.js +8 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/index.mjs +3 -0
- package/dist/file/index.mjs.map +1 -0
- package/dist/file/providers/destination/index.js +248 -0
- package/dist/file/providers/destination/index.js.map +1 -0
- package/dist/file/providers/destination/index.mjs +246 -0
- package/dist/file/providers/destination/index.mjs.map +1 -0
- package/dist/file/providers/destination/utils.js +63 -0
- package/dist/file/providers/destination/utils.js.map +1 -0
- package/dist/file/providers/destination/utils.mjs +60 -0
- package/dist/file/providers/destination/utils.mjs.map +1 -0
- package/dist/file/providers/index.js +10 -0
- package/dist/file/providers/index.js.map +1 -0
- package/dist/file/providers/index.mjs +3 -0
- package/dist/file/providers/index.mjs.map +1 -0
- package/dist/file/providers/source/index.js +288 -0
- package/dist/file/providers/source/index.js.map +1 -0
- package/dist/file/providers/source/index.mjs +286 -0
- package/dist/file/providers/source/index.mjs.map +1 -0
- package/dist/file/providers/source/utils.js +56 -0
- package/dist/file/providers/source/utils.js.map +1 -0
- package/dist/file/providers/source/utils.mjs +52 -0
- package/dist/file/providers/source/utils.mjs.map +1 -0
- package/dist/index.js +8 -5692
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -5674
- package/dist/index.mjs.map +1 -1
- package/dist/strapi/index.js +12 -0
- package/dist/strapi/index.js.map +1 -0
- package/dist/strapi/index.mjs +7 -0
- package/dist/strapi/index.mjs.map +1 -0
- package/dist/strapi/providers/index.js +16 -0
- package/dist/strapi/providers/index.js.map +1 -0
- package/dist/strapi/providers/index.mjs +7 -0
- package/dist/strapi/providers/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/index.js +419 -0
- package/dist/strapi/providers/local-destination/index.js.map +1 -0
- package/dist/strapi/providers/local-destination/index.mjs +396 -0
- package/dist/strapi/providers/local-destination/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +52 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +49 -0
- package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js +64 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +62 -0
- package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.js +126 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +122 -0
- package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.js +60 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.js.map +1 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.mjs +58 -0
- package/dist/strapi/providers/local-destination/strategies/restore/links.mjs.map +1 -0
- package/dist/strapi/providers/local-source/assets.js +123 -0
- package/dist/strapi/providers/local-source/assets.js.map +1 -0
- package/dist/strapi/providers/local-source/assets.mjs +121 -0
- package/dist/strapi/providers/local-source/assets.mjs.map +1 -0
- package/dist/strapi/providers/local-source/configuration.js +39 -0
- package/dist/strapi/providers/local-source/configuration.js.map +1 -0
- package/dist/strapi/providers/local-source/configuration.mjs +37 -0
- package/dist/strapi/providers/local-source/configuration.mjs.map +1 -0
- package/dist/strapi/providers/local-source/entities.js +62 -0
- package/dist/strapi/providers/local-source/entities.js.map +1 -0
- package/dist/strapi/providers/local-source/entities.mjs +59 -0
- package/dist/strapi/providers/local-source/entities.mjs.map +1 -0
- package/dist/strapi/providers/local-source/index.js +154 -0
- package/dist/strapi/providers/local-source/index.js.map +1 -0
- package/dist/strapi/providers/local-source/index.mjs +152 -0
- package/dist/strapi/providers/local-source/index.mjs.map +1 -0
- package/dist/strapi/providers/local-source/links.js +26 -0
- package/dist/strapi/providers/local-source/links.js.map +1 -0
- package/dist/strapi/providers/local-source/links.mjs +24 -0
- package/dist/strapi/providers/local-source/links.mjs.map +1 -0
- package/dist/strapi/providers/remote-destination/index.js +392 -0
- package/dist/strapi/providers/remote-destination/index.js.map +1 -0
- package/dist/strapi/providers/remote-destination/index.mjs +390 -0
- package/dist/strapi/providers/remote-destination/index.mjs.map +1 -0
- package/dist/strapi/providers/remote-source/index.js +405 -0
- package/dist/strapi/providers/remote-source/index.js.map +1 -0
- package/dist/strapi/providers/remote-source/index.mjs +403 -0
- package/dist/strapi/providers/remote-source/index.mjs.map +1 -0
- package/dist/strapi/providers/utils.js +173 -0
- package/dist/strapi/providers/utils.js.map +1 -0
- package/dist/strapi/providers/utils.mjs +169 -0
- package/dist/strapi/providers/utils.mjs.map +1 -0
- package/dist/strapi/queries/entity.js +125 -0
- package/dist/strapi/queries/entity.js.map +1 -0
- package/dist/strapi/queries/entity.mjs +123 -0
- package/dist/strapi/queries/entity.mjs.map +1 -0
- package/dist/strapi/queries/index.js +10 -0
- package/dist/strapi/queries/index.js.map +1 -0
- package/dist/strapi/queries/index.mjs +5 -0
- package/dist/strapi/queries/index.mjs.map +1 -0
- package/dist/strapi/queries/link.js +298 -0
- package/dist/strapi/queries/link.js.map +1 -0
- package/dist/strapi/queries/link.mjs +295 -0
- package/dist/strapi/queries/link.mjs.map +1 -0
- package/dist/strapi/remote/constants.js +11 -0
- package/dist/strapi/remote/constants.js.map +1 -0
- package/dist/strapi/remote/constants.mjs +8 -0
- package/dist/strapi/remote/constants.mjs.map +1 -0
- package/dist/strapi/remote/flows/default.js +43 -0
- package/dist/strapi/remote/flows/default.js.map +1 -0
- package/dist/strapi/remote/flows/default.mjs +41 -0
- package/dist/strapi/remote/flows/default.mjs.map +1 -0
- package/dist/strapi/remote/flows/index.js +54 -0
- package/dist/strapi/remote/flows/index.js.map +1 -0
- package/dist/strapi/remote/flows/index.mjs +52 -0
- package/dist/strapi/remote/flows/index.mjs.map +1 -0
- package/dist/strapi/remote/handlers/constants.js +10 -0
- package/dist/strapi/remote/handlers/constants.js.map +1 -0
- package/dist/strapi/remote/handlers/constants.mjs +8 -0
- package/dist/strapi/remote/handlers/constants.mjs.map +1 -0
- package/dist/strapi/remote/handlers/index.js +12 -0
- package/dist/strapi/remote/handlers/index.js.map +1 -0
- package/dist/strapi/remote/handlers/index.mjs +4 -0
- package/dist/strapi/remote/handlers/index.mjs.map +1 -0
- package/dist/strapi/remote/handlers/pull.js +348 -0
- package/dist/strapi/remote/handlers/pull.js.map +1 -0
- package/dist/strapi/remote/handlers/pull.mjs +346 -0
- package/dist/strapi/remote/handlers/pull.mjs.map +1 -0
- package/dist/strapi/remote/handlers/push.js +400 -0
- package/dist/strapi/remote/handlers/push.js.map +1 -0
- package/dist/strapi/remote/handlers/push.mjs +398 -0
- package/dist/strapi/remote/handlers/push.mjs.map +1 -0
- package/dist/strapi/remote/handlers/utils.js +316 -0
- package/dist/strapi/remote/handlers/utils.js.map +1 -0
- package/dist/strapi/remote/handlers/utils.mjs +310 -0
- package/dist/strapi/remote/handlers/utils.mjs.map +1 -0
- package/dist/strapi/remote/index.js +10 -0
- package/dist/strapi/remote/index.js.map +1 -0
- package/dist/strapi/remote/index.mjs +5 -0
- package/dist/strapi/remote/index.mjs.map +1 -0
- package/dist/utils/components.js +178 -0
- package/dist/utils/components.js.map +1 -0
- package/dist/utils/components.mjs +171 -0
- package/dist/utils/components.mjs.map +1 -0
- package/dist/utils/diagnostic.js +51 -0
- package/dist/utils/diagnostic.js.map +1 -0
- package/dist/utils/diagnostic.mjs +49 -0
- package/dist/utils/diagnostic.mjs.map +1 -0
- package/dist/utils/encryption/decrypt.js +47 -0
- package/dist/utils/encryption/decrypt.js.map +1 -0
- package/dist/utils/encryption/decrypt.mjs +45 -0
- package/dist/utils/encryption/decrypt.mjs.map +1 -0
- package/dist/utils/encryption/encrypt.js +47 -0
- package/dist/utils/encryption/encrypt.js.map +1 -0
- package/dist/utils/encryption/encrypt.mjs +45 -0
- package/dist/utils/encryption/encrypt.mjs.map +1 -0
- package/dist/utils/encryption/index.js +10 -0
- package/dist/utils/encryption/index.js.map +1 -0
- package/dist/utils/encryption/index.mjs +3 -0
- package/dist/utils/encryption/index.mjs.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +15 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/json.js +96 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/json.mjs +94 -0
- package/dist/utils/json.mjs.map +1 -0
- package/dist/utils/middleware.js +14 -0
- package/dist/utils/middleware.js.map +1 -0
- package/dist/utils/middleware.mjs +12 -0
- package/dist/utils/middleware.mjs.map +1 -0
- package/dist/utils/providers.js +12 -0
- package/dist/utils/providers.js.map +1 -0
- package/dist/utils/providers.mjs +10 -0
- package/dist/utils/providers.mjs.map +1 -0
- package/dist/utils/schema.js +32 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/schema.mjs +29 -0
- package/dist/utils/schema.mjs.map +1 -0
- package/dist/utils/stream.js +59 -0
- package/dist/utils/stream.js.map +1 -0
- package/dist/utils/stream.mjs +55 -0
- package/dist/utils/stream.mjs.map +1 -0
- package/dist/utils/transaction.js +93 -0
- package/dist/utils/transaction.js.map +1 -0
- package/dist/utils/transaction.mjs +91 -0
- package/dist/utils/transaction.mjs.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/strapi/providers/utils.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { RawData, WebSocket } from 'ws';\n\nimport type { Client, Server } from '../../../types/remote/protocol';\n\nimport {\n ProviderError,\n ProviderTransferError,\n ProviderInitializationError,\n ProviderValidationError,\n ProviderErrorDetails,\n} from '../../errors/providers';\nimport { IDiagnosticReporter } from '../../utils/diagnostic';\n\ninterface IDispatcherState {\n transfer?: { kind: Client.TransferKind; id: string };\n}\n\ninterface IDispatchOptions {\n attachTransfer?: boolean;\n}\n\ntype Dispatch<T> = Omit<T, 'transferID' | 'uuid'>;\n\nexport const createDispatcher = (\n ws: WebSocket,\n retryMessageOptions = {\n retryMessageMaxRetries: 5,\n retryMessageTimeout: 30000,\n },\n reportInfo?: (message: string) => void\n) => {\n const state: IDispatcherState = {};\n\n type DispatchMessage = Dispatch<Client.Message>;\n\n const dispatch = async <U = null>(\n message: DispatchMessage,\n options: IDispatchOptions = {}\n ): Promise<U | null> => {\n if (!ws) {\n throw new Error('No websocket connection found');\n }\n\n return new Promise<U | null>((resolve, reject) => {\n const uuid = randomUUID();\n const payload = { ...message, uuid };\n let numberOfTimesMessageWasSent = 0;\n\n if (options.attachTransfer) {\n Object.assign(payload, { transferID: state.transfer?.id });\n }\n\n if (message.type === 'command') {\n reportInfo?.(\n `dispatching message command:${(message as Client.CommandMessage).command} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`\n );\n } else if (message.type === 'transfer') {\n const messageToSend = message as Client.TransferMessage;\n reportInfo?.(\n `dispatching message action:${messageToSend.action} ${messageToSend.kind === 'step' ? `step:${messageToSend.step}` : ''} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`\n );\n }\n const stringifiedPayload = JSON.stringify(payload);\n ws.send(stringifiedPayload, (error) => {\n if (error) {\n reject(error);\n }\n });\n const { retryMessageMaxRetries, retryMessageTimeout } = retryMessageOptions;\n const sendPeriodically = () => {\n if (numberOfTimesMessageWasSent <= retryMessageMaxRetries) {\n numberOfTimesMessageWasSent += 1;\n ws.send(stringifiedPayload, (error) => {\n if (error) {\n reject(error);\n }\n });\n } else {\n reject(new ProviderError('error', 'Request timed out'));\n }\n };\n const interval = setInterval(sendPeriodically, retryMessageTimeout);\n\n const onResponse = (raw: RawData) => {\n const response: Server.Message<U> = JSON.parse(raw.toString());\n if (message.type === 'command') {\n reportInfo?.(\n `received response to message command: ${(message as Client.CommandMessage).command} uuid: ${uuid} sent: ${numberOfTimesMessageWasSent}`\n );\n } else if (message.type === 'transfer') {\n const messageToSend = message as Client.TransferMessage;\n reportInfo?.(\n `received response to message action:${messageToSend.action} ${messageToSend.kind === 'step' ? `step:${messageToSend.step}` : ''} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`\n );\n }\n if (response.uuid === uuid) {\n clearInterval(interval);\n if (response.error) {\n const message = response.error.message;\n const details = response.error.details?.details as ProviderErrorDetails;\n const step = response.error.details?.step;\n let error = new ProviderError('error', message, details);\n if (step === 'transfer') {\n error = new ProviderTransferError(message, details);\n } else if (step === 'validation') {\n error = new ProviderValidationError(message, details);\n } else if (step === 'initialization') {\n error = new ProviderInitializationError(message);\n }\n return reject(error);\n }\n resolve(response.data ?? null);\n } else {\n ws.once('message', onResponse);\n }\n };\n\n ws.once('message', onResponse);\n });\n };\n\n const dispatchCommand = <U extends Client.Command>(\n payload: {\n command: U;\n } & ([Client.GetCommandParams<U>] extends [never]\n ? unknown\n : { params?: Client.GetCommandParams<U> })\n ) => {\n return dispatch({ type: 'command', ...payload } as Client.CommandMessage);\n };\n\n const dispatchTransferAction = async <T>(action: Client.Action['action']) => {\n const payload: Dispatch<Client.Action> = { type: 'transfer', kind: 'action', action };\n\n return dispatch<T>(payload, { attachTransfer: true }) ?? Promise.resolve(null);\n };\n\n const dispatchTransferStep = async <\n T,\n A extends Client.TransferPushMessage['action'] = Client.TransferPushMessage['action'],\n S extends Client.TransferPushStep = Client.TransferPushStep,\n >(\n payload: {\n step: S;\n action: A;\n } & (A extends 'stream' ? { data: Client.GetTransferPushStreamData<S> } : unknown)\n ) => {\n const message: Dispatch<Client.TransferPushMessage> = {\n type: 'transfer',\n kind: 'step',\n ...payload,\n };\n\n return dispatch<T>(message, { attachTransfer: true }) ?? Promise.resolve(null);\n };\n\n const setTransferProperties = (\n properties: Exclude<IDispatcherState['transfer'], undefined>\n ): void => {\n state.transfer = { ...properties };\n };\n\n return {\n get transferID() {\n return state.transfer?.id;\n },\n\n get transferKind() {\n return state.transfer?.kind;\n },\n\n setTransferProperties,\n\n dispatch,\n dispatchCommand,\n dispatchTransferAction,\n dispatchTransferStep,\n };\n};\n\ntype WebsocketParams = ConstructorParameters<typeof WebSocket>;\ntype Address = WebsocketParams[0];\ntype Options = WebsocketParams[2];\n\nexport const connectToWebsocket = (\n address: Address,\n options?: Options,\n diagnostics?: IDiagnosticReporter\n): Promise<WebSocket> => {\n return new Promise((resolve, reject) => {\n const server = new WebSocket(address, options);\n server.once('open', () => {\n resolve(server);\n });\n\n server.on('unexpected-response', (_req, res) => {\n if (res.statusCode === 401) {\n return reject(\n new ProviderInitializationError(\n 'Failed to initialize the connection: Authentication Error'\n )\n );\n }\n\n if (res.statusCode === 403) {\n return reject(\n new ProviderInitializationError(\n 'Failed to initialize the connection: Authorization Error'\n )\n );\n }\n\n if (res.statusCode === 404) {\n return reject(\n new ProviderInitializationError(\n 'Failed to initialize the connection: Data transfer is not enabled on the remote host'\n )\n );\n }\n\n return reject(\n new ProviderInitializationError(\n `Failed to initialize the connection: Unexpected server response ${res.statusCode}`\n )\n );\n });\n\n server.on('message', (raw: RawData) => {\n const response: Server.Message = JSON.parse(raw.toString());\n if (response.diagnostic) {\n diagnostics?.report({\n ...response.diagnostic,\n });\n }\n });\n\n server.once('error', (err) => {\n reject(\n new ProviderTransferError(err.message, {\n details: {\n error: err.message,\n },\n })\n );\n });\n });\n};\n\nexport const trimTrailingSlash = (input: string): string => {\n return input.replace(/\\/$/, '');\n};\n\nexport const wait = (ms: number) => {\n return new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n};\n\nexport const waitUntil = async (test: () => boolean, interval: number): Promise<void> => {\n while (!test()) {\n await wait(interval);\n }\n\n return Promise.resolve();\n};\n"],"names":["createDispatcher","ws","retryMessageOptions","retryMessageMaxRetries","retryMessageTimeout","reportInfo","state","dispatch","message","options","Error","Promise","resolve","reject","uuid","randomUUID","payload","numberOfTimesMessageWasSent","attachTransfer","Object","assign","transferID","transfer","id","type","command","messageToSend","action","kind","step","stringifiedPayload","JSON","stringify","send","error","sendPeriodically","ProviderError","interval","setInterval","onResponse","raw","response","parse","toString","clearInterval","details","ProviderTransferError","ProviderValidationError","ProviderInitializationError","data","once","dispatchCommand","dispatchTransferAction","dispatchTransferStep","setTransferProperties","properties","transferKind","connectToWebsocket","address","diagnostics","server","WebSocket","on","_req","res","statusCode","diagnostic","report","err","trimTrailingSlash","input","replace"],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import { WebSocket } from 'ws';
|
|
3
|
+
import { ProviderInitializationError, ProviderTransferError, ProviderError, ProviderValidationError } from '../../errors/providers.mjs';
|
|
4
|
+
|
|
5
|
+
const createDispatcher = (ws, retryMessageOptions = {
|
|
6
|
+
retryMessageMaxRetries: 5,
|
|
7
|
+
retryMessageTimeout: 30000
|
|
8
|
+
}, reportInfo)=>{
|
|
9
|
+
const state = {};
|
|
10
|
+
const dispatch = async (message, options = {})=>{
|
|
11
|
+
if (!ws) {
|
|
12
|
+
throw new Error('No websocket connection found');
|
|
13
|
+
}
|
|
14
|
+
return new Promise((resolve, reject)=>{
|
|
15
|
+
const uuid = randomUUID();
|
|
16
|
+
const payload = {
|
|
17
|
+
...message,
|
|
18
|
+
uuid
|
|
19
|
+
};
|
|
20
|
+
let numberOfTimesMessageWasSent = 0;
|
|
21
|
+
if (options.attachTransfer) {
|
|
22
|
+
Object.assign(payload, {
|
|
23
|
+
transferID: state.transfer?.id
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (message.type === 'command') {
|
|
27
|
+
reportInfo?.(`dispatching message command:${message.command} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`);
|
|
28
|
+
} else if (message.type === 'transfer') {
|
|
29
|
+
const messageToSend = message;
|
|
30
|
+
reportInfo?.(`dispatching message action:${messageToSend.action} ${messageToSend.kind === 'step' ? `step:${messageToSend.step}` : ''} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`);
|
|
31
|
+
}
|
|
32
|
+
const stringifiedPayload = JSON.stringify(payload);
|
|
33
|
+
ws.send(stringifiedPayload, (error)=>{
|
|
34
|
+
if (error) {
|
|
35
|
+
reject(error);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const { retryMessageMaxRetries, retryMessageTimeout } = retryMessageOptions;
|
|
39
|
+
const sendPeriodically = ()=>{
|
|
40
|
+
if (numberOfTimesMessageWasSent <= retryMessageMaxRetries) {
|
|
41
|
+
numberOfTimesMessageWasSent += 1;
|
|
42
|
+
ws.send(stringifiedPayload, (error)=>{
|
|
43
|
+
if (error) {
|
|
44
|
+
reject(error);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
} else {
|
|
48
|
+
reject(new ProviderError('error', 'Request timed out'));
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const interval = setInterval(sendPeriodically, retryMessageTimeout);
|
|
52
|
+
const onResponse = (raw)=>{
|
|
53
|
+
const response = JSON.parse(raw.toString());
|
|
54
|
+
if (message.type === 'command') {
|
|
55
|
+
reportInfo?.(`received response to message command: ${message.command} uuid: ${uuid} sent: ${numberOfTimesMessageWasSent}`);
|
|
56
|
+
} else if (message.type === 'transfer') {
|
|
57
|
+
const messageToSend = message;
|
|
58
|
+
reportInfo?.(`received response to message action:${messageToSend.action} ${messageToSend.kind === 'step' ? `step:${messageToSend.step}` : ''} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`);
|
|
59
|
+
}
|
|
60
|
+
if (response.uuid === uuid) {
|
|
61
|
+
clearInterval(interval);
|
|
62
|
+
if (response.error) {
|
|
63
|
+
const message = response.error.message;
|
|
64
|
+
const details = response.error.details?.details;
|
|
65
|
+
const step = response.error.details?.step;
|
|
66
|
+
let error = new ProviderError('error', message, details);
|
|
67
|
+
if (step === 'transfer') {
|
|
68
|
+
error = new ProviderTransferError(message, details);
|
|
69
|
+
} else if (step === 'validation') {
|
|
70
|
+
error = new ProviderValidationError(message, details);
|
|
71
|
+
} else if (step === 'initialization') {
|
|
72
|
+
error = new ProviderInitializationError(message);
|
|
73
|
+
}
|
|
74
|
+
return reject(error);
|
|
75
|
+
}
|
|
76
|
+
resolve(response.data ?? null);
|
|
77
|
+
} else {
|
|
78
|
+
ws.once('message', onResponse);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
ws.once('message', onResponse);
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
const dispatchCommand = (payload)=>{
|
|
85
|
+
return dispatch({
|
|
86
|
+
type: 'command',
|
|
87
|
+
...payload
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
const dispatchTransferAction = async (action)=>{
|
|
91
|
+
const payload = {
|
|
92
|
+
type: 'transfer',
|
|
93
|
+
kind: 'action',
|
|
94
|
+
action
|
|
95
|
+
};
|
|
96
|
+
return dispatch(payload, {
|
|
97
|
+
attachTransfer: true
|
|
98
|
+
}) ?? Promise.resolve(null);
|
|
99
|
+
};
|
|
100
|
+
const dispatchTransferStep = async (payload)=>{
|
|
101
|
+
const message = {
|
|
102
|
+
type: 'transfer',
|
|
103
|
+
kind: 'step',
|
|
104
|
+
...payload
|
|
105
|
+
};
|
|
106
|
+
return dispatch(message, {
|
|
107
|
+
attachTransfer: true
|
|
108
|
+
}) ?? Promise.resolve(null);
|
|
109
|
+
};
|
|
110
|
+
const setTransferProperties = (properties)=>{
|
|
111
|
+
state.transfer = {
|
|
112
|
+
...properties
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
get transferID () {
|
|
117
|
+
return state.transfer?.id;
|
|
118
|
+
},
|
|
119
|
+
get transferKind () {
|
|
120
|
+
return state.transfer?.kind;
|
|
121
|
+
},
|
|
122
|
+
setTransferProperties,
|
|
123
|
+
dispatch,
|
|
124
|
+
dispatchCommand,
|
|
125
|
+
dispatchTransferAction,
|
|
126
|
+
dispatchTransferStep
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
const connectToWebsocket = (address, options, diagnostics)=>{
|
|
130
|
+
return new Promise((resolve, reject)=>{
|
|
131
|
+
const server = new WebSocket(address, options);
|
|
132
|
+
server.once('open', ()=>{
|
|
133
|
+
resolve(server);
|
|
134
|
+
});
|
|
135
|
+
server.on('unexpected-response', (_req, res)=>{
|
|
136
|
+
if (res.statusCode === 401) {
|
|
137
|
+
return reject(new ProviderInitializationError('Failed to initialize the connection: Authentication Error'));
|
|
138
|
+
}
|
|
139
|
+
if (res.statusCode === 403) {
|
|
140
|
+
return reject(new ProviderInitializationError('Failed to initialize the connection: Authorization Error'));
|
|
141
|
+
}
|
|
142
|
+
if (res.statusCode === 404) {
|
|
143
|
+
return reject(new ProviderInitializationError('Failed to initialize the connection: Data transfer is not enabled on the remote host'));
|
|
144
|
+
}
|
|
145
|
+
return reject(new ProviderInitializationError(`Failed to initialize the connection: Unexpected server response ${res.statusCode}`));
|
|
146
|
+
});
|
|
147
|
+
server.on('message', (raw)=>{
|
|
148
|
+
const response = JSON.parse(raw.toString());
|
|
149
|
+
if (response.diagnostic) {
|
|
150
|
+
diagnostics?.report({
|
|
151
|
+
...response.diagnostic
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
server.once('error', (err)=>{
|
|
156
|
+
reject(new ProviderTransferError(err.message, {
|
|
157
|
+
details: {
|
|
158
|
+
error: err.message
|
|
159
|
+
}
|
|
160
|
+
}));
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
const trimTrailingSlash = (input)=>{
|
|
165
|
+
return input.replace(/\/$/, '');
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export { connectToWebsocket, createDispatcher, trimTrailingSlash };
|
|
169
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../src/strapi/providers/utils.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { RawData, WebSocket } from 'ws';\n\nimport type { Client, Server } from '../../../types/remote/protocol';\n\nimport {\n ProviderError,\n ProviderTransferError,\n ProviderInitializationError,\n ProviderValidationError,\n ProviderErrorDetails,\n} from '../../errors/providers';\nimport { IDiagnosticReporter } from '../../utils/diagnostic';\n\ninterface IDispatcherState {\n transfer?: { kind: Client.TransferKind; id: string };\n}\n\ninterface IDispatchOptions {\n attachTransfer?: boolean;\n}\n\ntype Dispatch<T> = Omit<T, 'transferID' | 'uuid'>;\n\nexport const createDispatcher = (\n ws: WebSocket,\n retryMessageOptions = {\n retryMessageMaxRetries: 5,\n retryMessageTimeout: 30000,\n },\n reportInfo?: (message: string) => void\n) => {\n const state: IDispatcherState = {};\n\n type DispatchMessage = Dispatch<Client.Message>;\n\n const dispatch = async <U = null>(\n message: DispatchMessage,\n options: IDispatchOptions = {}\n ): Promise<U | null> => {\n if (!ws) {\n throw new Error('No websocket connection found');\n }\n\n return new Promise<U | null>((resolve, reject) => {\n const uuid = randomUUID();\n const payload = { ...message, uuid };\n let numberOfTimesMessageWasSent = 0;\n\n if (options.attachTransfer) {\n Object.assign(payload, { transferID: state.transfer?.id });\n }\n\n if (message.type === 'command') {\n reportInfo?.(\n `dispatching message command:${(message as Client.CommandMessage).command} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`\n );\n } else if (message.type === 'transfer') {\n const messageToSend = message as Client.TransferMessage;\n reportInfo?.(\n `dispatching message action:${messageToSend.action} ${messageToSend.kind === 'step' ? `step:${messageToSend.step}` : ''} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`\n );\n }\n const stringifiedPayload = JSON.stringify(payload);\n ws.send(stringifiedPayload, (error) => {\n if (error) {\n reject(error);\n }\n });\n const { retryMessageMaxRetries, retryMessageTimeout } = retryMessageOptions;\n const sendPeriodically = () => {\n if (numberOfTimesMessageWasSent <= retryMessageMaxRetries) {\n numberOfTimesMessageWasSent += 1;\n ws.send(stringifiedPayload, (error) => {\n if (error) {\n reject(error);\n }\n });\n } else {\n reject(new ProviderError('error', 'Request timed out'));\n }\n };\n const interval = setInterval(sendPeriodically, retryMessageTimeout);\n\n const onResponse = (raw: RawData) => {\n const response: Server.Message<U> = JSON.parse(raw.toString());\n if (message.type === 'command') {\n reportInfo?.(\n `received response to message command: ${(message as Client.CommandMessage).command} uuid: ${uuid} sent: ${numberOfTimesMessageWasSent}`\n );\n } else if (message.type === 'transfer') {\n const messageToSend = message as Client.TransferMessage;\n reportInfo?.(\n `received response to message action:${messageToSend.action} ${messageToSend.kind === 'step' ? `step:${messageToSend.step}` : ''} uuid:${uuid} sent:${numberOfTimesMessageWasSent}`\n );\n }\n if (response.uuid === uuid) {\n clearInterval(interval);\n if (response.error) {\n const message = response.error.message;\n const details = response.error.details?.details as ProviderErrorDetails;\n const step = response.error.details?.step;\n let error = new ProviderError('error', message, details);\n if (step === 'transfer') {\n error = new ProviderTransferError(message, details);\n } else if (step === 'validation') {\n error = new ProviderValidationError(message, details);\n } else if (step === 'initialization') {\n error = new ProviderInitializationError(message);\n }\n return reject(error);\n }\n resolve(response.data ?? null);\n } else {\n ws.once('message', onResponse);\n }\n };\n\n ws.once('message', onResponse);\n });\n };\n\n const dispatchCommand = <U extends Client.Command>(\n payload: {\n command: U;\n } & ([Client.GetCommandParams<U>] extends [never]\n ? unknown\n : { params?: Client.GetCommandParams<U> })\n ) => {\n return dispatch({ type: 'command', ...payload } as Client.CommandMessage);\n };\n\n const dispatchTransferAction = async <T>(action: Client.Action['action']) => {\n const payload: Dispatch<Client.Action> = { type: 'transfer', kind: 'action', action };\n\n return dispatch<T>(payload, { attachTransfer: true }) ?? Promise.resolve(null);\n };\n\n const dispatchTransferStep = async <\n T,\n A extends Client.TransferPushMessage['action'] = Client.TransferPushMessage['action'],\n S extends Client.TransferPushStep = Client.TransferPushStep,\n >(\n payload: {\n step: S;\n action: A;\n } & (A extends 'stream' ? { data: Client.GetTransferPushStreamData<S> } : unknown)\n ) => {\n const message: Dispatch<Client.TransferPushMessage> = {\n type: 'transfer',\n kind: 'step',\n ...payload,\n };\n\n return dispatch<T>(message, { attachTransfer: true }) ?? Promise.resolve(null);\n };\n\n const setTransferProperties = (\n properties: Exclude<IDispatcherState['transfer'], undefined>\n ): void => {\n state.transfer = { ...properties };\n };\n\n return {\n get transferID() {\n return state.transfer?.id;\n },\n\n get transferKind() {\n return state.transfer?.kind;\n },\n\n setTransferProperties,\n\n dispatch,\n dispatchCommand,\n dispatchTransferAction,\n dispatchTransferStep,\n };\n};\n\ntype WebsocketParams = ConstructorParameters<typeof WebSocket>;\ntype Address = WebsocketParams[0];\ntype Options = WebsocketParams[2];\n\nexport const connectToWebsocket = (\n address: Address,\n options?: Options,\n diagnostics?: IDiagnosticReporter\n): Promise<WebSocket> => {\n return new Promise((resolve, reject) => {\n const server = new WebSocket(address, options);\n server.once('open', () => {\n resolve(server);\n });\n\n server.on('unexpected-response', (_req, res) => {\n if (res.statusCode === 401) {\n return reject(\n new ProviderInitializationError(\n 'Failed to initialize the connection: Authentication Error'\n )\n );\n }\n\n if (res.statusCode === 403) {\n return reject(\n new ProviderInitializationError(\n 'Failed to initialize the connection: Authorization Error'\n )\n );\n }\n\n if (res.statusCode === 404) {\n return reject(\n new ProviderInitializationError(\n 'Failed to initialize the connection: Data transfer is not enabled on the remote host'\n )\n );\n }\n\n return reject(\n new ProviderInitializationError(\n `Failed to initialize the connection: Unexpected server response ${res.statusCode}`\n )\n );\n });\n\n server.on('message', (raw: RawData) => {\n const response: Server.Message = JSON.parse(raw.toString());\n if (response.diagnostic) {\n diagnostics?.report({\n ...response.diagnostic,\n });\n }\n });\n\n server.once('error', (err) => {\n reject(\n new ProviderTransferError(err.message, {\n details: {\n error: err.message,\n },\n })\n );\n });\n });\n};\n\nexport const trimTrailingSlash = (input: string): string => {\n return input.replace(/\\/$/, '');\n};\n\nexport const wait = (ms: number) => {\n return new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n};\n\nexport const waitUntil = async (test: () => boolean, interval: number): Promise<void> => {\n while (!test()) {\n await wait(interval);\n }\n\n return Promise.resolve();\n};\n"],"names":["createDispatcher","ws","retryMessageOptions","retryMessageMaxRetries","retryMessageTimeout","reportInfo","state","dispatch","message","options","Error","Promise","resolve","reject","uuid","randomUUID","payload","numberOfTimesMessageWasSent","attachTransfer","Object","assign","transferID","transfer","id","type","command","messageToSend","action","kind","step","stringifiedPayload","JSON","stringify","send","error","sendPeriodically","ProviderError","interval","setInterval","onResponse","raw","response","parse","toString","clearInterval","details","ProviderTransferError","ProviderValidationError","ProviderInitializationError","data","once","dispatchCommand","dispatchTransferAction","dispatchTransferStep","setTransferProperties","properties","transferKind","connectToWebsocket","address","diagnostics","server","WebSocket","on","_req","res","statusCode","diagnostic","report","err","trimTrailingSlash","input","replace"],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fp = require('lodash/fp');
|
|
4
|
+
var components = require('../../utils/components.js');
|
|
5
|
+
|
|
6
|
+
const sanitizeComponentLikeAttributes = (model, data)=>{
|
|
7
|
+
const { attributes } = model;
|
|
8
|
+
const componentLikeAttributesKey = Object.entries(attributes).filter(([, attribute])=>attribute.type === 'component' || attribute.type === 'dynamiczone').map(([key])=>key);
|
|
9
|
+
return fp.omit(componentLikeAttributesKey, data);
|
|
10
|
+
};
|
|
11
|
+
const omitInvalidCreationAttributes = fp.omit([
|
|
12
|
+
'id'
|
|
13
|
+
]);
|
|
14
|
+
const createEntityQuery = (strapi)=>{
|
|
15
|
+
const components$1 = {
|
|
16
|
+
async assignToEntity (uid, data) {
|
|
17
|
+
const model = strapi.getModel(uid);
|
|
18
|
+
const entityComponents = await components.createComponents(uid, data);
|
|
19
|
+
const dataWithoutComponents = sanitizeComponentLikeAttributes(model, data);
|
|
20
|
+
return fp.assign(entityComponents, dataWithoutComponents);
|
|
21
|
+
},
|
|
22
|
+
async get (uid, entity) {
|
|
23
|
+
return components.getComponents(uid, entity);
|
|
24
|
+
},
|
|
25
|
+
delete (uid, componentsToDelete) {
|
|
26
|
+
return components.deleteComponents(uid, componentsToDelete, {
|
|
27
|
+
loadComponents: false
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const query = (uid)=>{
|
|
32
|
+
const create = async (params)=>{
|
|
33
|
+
const dataWithComponents = await components$1.assignToEntity(uid, params.data);
|
|
34
|
+
const sanitizedData = omitInvalidCreationAttributes(dataWithComponents);
|
|
35
|
+
return strapi.db.query(uid).create({
|
|
36
|
+
...params,
|
|
37
|
+
data: sanitizedData
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const createMany = async (params)=>{
|
|
41
|
+
return Promise.resolve(params.data)// Create components for each entity
|
|
42
|
+
.then(fp.map((data)=>components$1.assignToEntity(uid, data)))// Remove unwanted attributes
|
|
43
|
+
.then(fp.map(omitInvalidCreationAttributes))// Execute a strapi db createMany query with all the entities + their created components
|
|
44
|
+
.then((data)=>strapi.db.query(uid).createMany({
|
|
45
|
+
...params,
|
|
46
|
+
data
|
|
47
|
+
}));
|
|
48
|
+
};
|
|
49
|
+
const deleteMany = async (params)=>{
|
|
50
|
+
const entitiesToDelete = await strapi.db.query(uid).findMany(params ?? {});
|
|
51
|
+
if (!entitiesToDelete.length) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const componentsToDelete = await Promise.all(entitiesToDelete.map((entityToDelete)=>components$1.get(uid, entityToDelete)));
|
|
55
|
+
const deletedEntities = await strapi.db.query(uid).deleteMany(params);
|
|
56
|
+
await Promise.all(componentsToDelete.map((compos)=>components$1.delete(uid, compos)));
|
|
57
|
+
return deletedEntities;
|
|
58
|
+
};
|
|
59
|
+
const getDeepPopulateComponentLikeQuery = (contentType, params = {
|
|
60
|
+
select: '*'
|
|
61
|
+
})=>{
|
|
62
|
+
const { attributes } = contentType;
|
|
63
|
+
const populate = {};
|
|
64
|
+
const entries = Object.entries(attributes);
|
|
65
|
+
for (const [key, attribute] of entries){
|
|
66
|
+
if (attribute.type === 'component') {
|
|
67
|
+
const component = strapi.getModel(attribute.component);
|
|
68
|
+
const subPopulate = getDeepPopulateComponentLikeQuery(component, params);
|
|
69
|
+
if ((fp.isArray(subPopulate) || fp.isObject(subPopulate)) && fp.size(subPopulate) > 0) {
|
|
70
|
+
populate[key] = {
|
|
71
|
+
...params,
|
|
72
|
+
populate: subPopulate
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (fp.isArray(subPopulate) && fp.isEmpty(subPopulate)) {
|
|
76
|
+
populate[key] = {
|
|
77
|
+
...params
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (attribute.type === 'dynamiczone') {
|
|
82
|
+
const { components: componentsUID } = attribute;
|
|
83
|
+
const on = {};
|
|
84
|
+
for (const componentUID of componentsUID){
|
|
85
|
+
const component = strapi.getModel(componentUID);
|
|
86
|
+
const subPopulate = getDeepPopulateComponentLikeQuery(component, params);
|
|
87
|
+
if ((fp.isArray(subPopulate) || fp.isObject(subPopulate)) && fp.size(subPopulate) > 0) {
|
|
88
|
+
on[componentUID] = {
|
|
89
|
+
...params,
|
|
90
|
+
populate: subPopulate
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (fp.isArray(subPopulate) && fp.isEmpty(subPopulate)) {
|
|
94
|
+
on[componentUID] = {
|
|
95
|
+
...params
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
populate[key] = fp.size(on) > 0 ? {
|
|
100
|
+
on
|
|
101
|
+
} : true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const values = Object.values(populate);
|
|
105
|
+
if (values.every((value)=>value === true)) {
|
|
106
|
+
return Object.keys(populate);
|
|
107
|
+
}
|
|
108
|
+
return populate;
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
create,
|
|
112
|
+
createMany,
|
|
113
|
+
deleteMany,
|
|
114
|
+
getDeepPopulateComponentLikeQuery,
|
|
115
|
+
get deepPopulateComponentLikeQuery () {
|
|
116
|
+
const contentType = strapi.getModel(uid);
|
|
117
|
+
return getDeepPopulateComponentLikeQuery(contentType);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
return query;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
exports.createEntityQuery = createEntityQuery;
|
|
125
|
+
//# sourceMappingURL=entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.js","sources":["../../../src/strapi/queries/entity.ts"],"sourcesContent":["import { assign, isArray, isEmpty, isObject, map, omit, size } from 'lodash/fp';\n\nimport type { Core, UID, Data, Struct } from '@strapi/types';\nimport * as componentsService from '../../utils/components';\n\nconst sanitizeComponentLikeAttributes = <T extends Struct.Schema>(\n model: T,\n data: Data.Entity<T['uid']>\n) => {\n const { attributes } = model;\n\n const componentLikeAttributesKey = Object.entries(attributes)\n .filter(([, attribute]) => attribute.type === 'component' || attribute.type === 'dynamiczone')\n .map(([key]) => key);\n\n return omit(componentLikeAttributesKey, data);\n};\n\nconst omitInvalidCreationAttributes = omit(['id']);\n\nconst createEntityQuery = (strapi: Core.Strapi): any => {\n const components = {\n async assignToEntity(uid: UID.Schema, data: any) {\n const model = strapi.getModel(uid);\n\n const entityComponents = await componentsService.createComponents(uid, data);\n const dataWithoutComponents = sanitizeComponentLikeAttributes(model, data);\n\n return assign(entityComponents, dataWithoutComponents);\n },\n\n async get<T extends object>(uid: string, entity: T) {\n return componentsService.getComponents(uid as UID.Schema, entity as any);\n },\n\n delete<T extends object>(uid: string, componentsToDelete: T) {\n return componentsService.deleteComponents(uid as UID.Schema, componentsToDelete as any, {\n loadComponents: false,\n });\n },\n };\n\n const query = (uid: UID.Schema) => {\n const create = async <T extends { data: U }, U extends object>(params: T) => {\n const dataWithComponents = await components.assignToEntity(uid, params.data);\n const sanitizedData = omitInvalidCreationAttributes(dataWithComponents);\n\n return strapi.db.query(uid).create({ ...params, data: sanitizedData });\n };\n\n const createMany = async <T extends { data: U[] }, U extends object>(params: T) => {\n return (\n Promise.resolve(params.data)\n // Create components for each entity\n .then(map((data) => components.assignToEntity(uid, data)))\n // Remove unwanted attributes\n .then(map(omitInvalidCreationAttributes))\n // Execute a strapi db createMany query with all the entities + their created components\n .then((data) => strapi.db.query(uid).createMany({ ...params, data }))\n );\n };\n\n const deleteMany = async <T extends object>(params?: T) => {\n const entitiesToDelete = await strapi.db.query(uid).findMany(params ?? {});\n\n if (!entitiesToDelete.length) {\n return null;\n }\n\n const componentsToDelete = await Promise.all(\n entitiesToDelete.map((entityToDelete) => components.get(uid, entityToDelete))\n );\n\n const deletedEntities = await strapi.db.query(uid).deleteMany(params);\n await Promise.all(componentsToDelete.map((compos) => components.delete(uid, compos)));\n\n return deletedEntities;\n };\n\n const getDeepPopulateComponentLikeQuery = (\n contentType: Struct.Schema,\n params = { select: '*' }\n ) => {\n const { attributes } = contentType;\n\n const populate: any = {};\n\n const entries: [string, any][] = Object.entries(attributes);\n\n for (const [key, attribute] of entries) {\n if (attribute.type === 'component') {\n const component = strapi.getModel(attribute.component);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {\n populate[key] = { ...params, populate: subPopulate };\n }\n\n if (isArray(subPopulate) && isEmpty(subPopulate)) {\n populate[key] = { ...params };\n }\n }\n\n if (attribute.type === 'dynamiczone') {\n const { components: componentsUID } = attribute;\n\n const on: any = {};\n\n for (const componentUID of componentsUID) {\n const component = strapi.getModel(componentUID);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {\n on[componentUID] = { ...params, populate: subPopulate };\n }\n\n if (isArray(subPopulate) && isEmpty(subPopulate)) {\n on[componentUID] = { ...params };\n }\n }\n\n populate[key] = size(on) > 0 ? { on } : true;\n }\n }\n\n const values = Object.values(populate);\n\n if (values.every((value) => value === true)) {\n return Object.keys(populate);\n }\n\n return populate;\n };\n\n return {\n create,\n createMany,\n deleteMany,\n getDeepPopulateComponentLikeQuery,\n\n get deepPopulateComponentLikeQuery() {\n const contentType = strapi.getModel(uid);\n\n return getDeepPopulateComponentLikeQuery(contentType);\n },\n };\n };\n\n return query;\n};\n\nexport { createEntityQuery };\n"],"names":["sanitizeComponentLikeAttributes","model","data","attributes","componentLikeAttributesKey","Object","entries","filter","attribute","type","map","key","omit","omitInvalidCreationAttributes","createEntityQuery","strapi","components","assignToEntity","uid","getModel","entityComponents","componentsService","dataWithoutComponents","assign","get","entity","delete","componentsToDelete","loadComponents","query","create","params","dataWithComponents","sanitizedData","db","createMany","Promise","resolve","then","deleteMany","entitiesToDelete","findMany","length","all","entityToDelete","deletedEntities","compos","getDeepPopulateComponentLikeQuery","contentType","select","populate","component","subPopulate","isArray","isObject","size","isEmpty","componentsUID","on","componentUID","values","every","value","keys","deepPopulateComponentLikeQuery"],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { omit, map, isArray, isObject, size, isEmpty, assign } from 'lodash/fp';
|
|
2
|
+
import { createComponents, getComponents, deleteComponents } from '../../utils/components.mjs';
|
|
3
|
+
|
|
4
|
+
const sanitizeComponentLikeAttributes = (model, data)=>{
|
|
5
|
+
const { attributes } = model;
|
|
6
|
+
const componentLikeAttributesKey = Object.entries(attributes).filter(([, attribute])=>attribute.type === 'component' || attribute.type === 'dynamiczone').map(([key])=>key);
|
|
7
|
+
return omit(componentLikeAttributesKey, data);
|
|
8
|
+
};
|
|
9
|
+
const omitInvalidCreationAttributes = omit([
|
|
10
|
+
'id'
|
|
11
|
+
]);
|
|
12
|
+
const createEntityQuery = (strapi)=>{
|
|
13
|
+
const components = {
|
|
14
|
+
async assignToEntity (uid, data) {
|
|
15
|
+
const model = strapi.getModel(uid);
|
|
16
|
+
const entityComponents = await createComponents(uid, data);
|
|
17
|
+
const dataWithoutComponents = sanitizeComponentLikeAttributes(model, data);
|
|
18
|
+
return assign(entityComponents, dataWithoutComponents);
|
|
19
|
+
},
|
|
20
|
+
async get (uid, entity) {
|
|
21
|
+
return getComponents(uid, entity);
|
|
22
|
+
},
|
|
23
|
+
delete (uid, componentsToDelete) {
|
|
24
|
+
return deleteComponents(uid, componentsToDelete, {
|
|
25
|
+
loadComponents: false
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const query = (uid)=>{
|
|
30
|
+
const create = async (params)=>{
|
|
31
|
+
const dataWithComponents = await components.assignToEntity(uid, params.data);
|
|
32
|
+
const sanitizedData = omitInvalidCreationAttributes(dataWithComponents);
|
|
33
|
+
return strapi.db.query(uid).create({
|
|
34
|
+
...params,
|
|
35
|
+
data: sanitizedData
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
const createMany = async (params)=>{
|
|
39
|
+
return Promise.resolve(params.data)// Create components for each entity
|
|
40
|
+
.then(map((data)=>components.assignToEntity(uid, data)))// Remove unwanted attributes
|
|
41
|
+
.then(map(omitInvalidCreationAttributes))// Execute a strapi db createMany query with all the entities + their created components
|
|
42
|
+
.then((data)=>strapi.db.query(uid).createMany({
|
|
43
|
+
...params,
|
|
44
|
+
data
|
|
45
|
+
}));
|
|
46
|
+
};
|
|
47
|
+
const deleteMany = async (params)=>{
|
|
48
|
+
const entitiesToDelete = await strapi.db.query(uid).findMany(params ?? {});
|
|
49
|
+
if (!entitiesToDelete.length) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const componentsToDelete = await Promise.all(entitiesToDelete.map((entityToDelete)=>components.get(uid, entityToDelete)));
|
|
53
|
+
const deletedEntities = await strapi.db.query(uid).deleteMany(params);
|
|
54
|
+
await Promise.all(componentsToDelete.map((compos)=>components.delete(uid, compos)));
|
|
55
|
+
return deletedEntities;
|
|
56
|
+
};
|
|
57
|
+
const getDeepPopulateComponentLikeQuery = (contentType, params = {
|
|
58
|
+
select: '*'
|
|
59
|
+
})=>{
|
|
60
|
+
const { attributes } = contentType;
|
|
61
|
+
const populate = {};
|
|
62
|
+
const entries = Object.entries(attributes);
|
|
63
|
+
for (const [key, attribute] of entries){
|
|
64
|
+
if (attribute.type === 'component') {
|
|
65
|
+
const component = strapi.getModel(attribute.component);
|
|
66
|
+
const subPopulate = getDeepPopulateComponentLikeQuery(component, params);
|
|
67
|
+
if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {
|
|
68
|
+
populate[key] = {
|
|
69
|
+
...params,
|
|
70
|
+
populate: subPopulate
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (isArray(subPopulate) && isEmpty(subPopulate)) {
|
|
74
|
+
populate[key] = {
|
|
75
|
+
...params
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (attribute.type === 'dynamiczone') {
|
|
80
|
+
const { components: componentsUID } = attribute;
|
|
81
|
+
const on = {};
|
|
82
|
+
for (const componentUID of componentsUID){
|
|
83
|
+
const component = strapi.getModel(componentUID);
|
|
84
|
+
const subPopulate = getDeepPopulateComponentLikeQuery(component, params);
|
|
85
|
+
if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {
|
|
86
|
+
on[componentUID] = {
|
|
87
|
+
...params,
|
|
88
|
+
populate: subPopulate
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (isArray(subPopulate) && isEmpty(subPopulate)) {
|
|
92
|
+
on[componentUID] = {
|
|
93
|
+
...params
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
populate[key] = size(on) > 0 ? {
|
|
98
|
+
on
|
|
99
|
+
} : true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const values = Object.values(populate);
|
|
103
|
+
if (values.every((value)=>value === true)) {
|
|
104
|
+
return Object.keys(populate);
|
|
105
|
+
}
|
|
106
|
+
return populate;
|
|
107
|
+
};
|
|
108
|
+
return {
|
|
109
|
+
create,
|
|
110
|
+
createMany,
|
|
111
|
+
deleteMany,
|
|
112
|
+
getDeepPopulateComponentLikeQuery,
|
|
113
|
+
get deepPopulateComponentLikeQuery () {
|
|
114
|
+
const contentType = strapi.getModel(uid);
|
|
115
|
+
return getDeepPopulateComponentLikeQuery(contentType);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
return query;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export { createEntityQuery };
|
|
123
|
+
//# sourceMappingURL=entity.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.mjs","sources":["../../../src/strapi/queries/entity.ts"],"sourcesContent":["import { assign, isArray, isEmpty, isObject, map, omit, size } from 'lodash/fp';\n\nimport type { Core, UID, Data, Struct } from '@strapi/types';\nimport * as componentsService from '../../utils/components';\n\nconst sanitizeComponentLikeAttributes = <T extends Struct.Schema>(\n model: T,\n data: Data.Entity<T['uid']>\n) => {\n const { attributes } = model;\n\n const componentLikeAttributesKey = Object.entries(attributes)\n .filter(([, attribute]) => attribute.type === 'component' || attribute.type === 'dynamiczone')\n .map(([key]) => key);\n\n return omit(componentLikeAttributesKey, data);\n};\n\nconst omitInvalidCreationAttributes = omit(['id']);\n\nconst createEntityQuery = (strapi: Core.Strapi): any => {\n const components = {\n async assignToEntity(uid: UID.Schema, data: any) {\n const model = strapi.getModel(uid);\n\n const entityComponents = await componentsService.createComponents(uid, data);\n const dataWithoutComponents = sanitizeComponentLikeAttributes(model, data);\n\n return assign(entityComponents, dataWithoutComponents);\n },\n\n async get<T extends object>(uid: string, entity: T) {\n return componentsService.getComponents(uid as UID.Schema, entity as any);\n },\n\n delete<T extends object>(uid: string, componentsToDelete: T) {\n return componentsService.deleteComponents(uid as UID.Schema, componentsToDelete as any, {\n loadComponents: false,\n });\n },\n };\n\n const query = (uid: UID.Schema) => {\n const create = async <T extends { data: U }, U extends object>(params: T) => {\n const dataWithComponents = await components.assignToEntity(uid, params.data);\n const sanitizedData = omitInvalidCreationAttributes(dataWithComponents);\n\n return strapi.db.query(uid).create({ ...params, data: sanitizedData });\n };\n\n const createMany = async <T extends { data: U[] }, U extends object>(params: T) => {\n return (\n Promise.resolve(params.data)\n // Create components for each entity\n .then(map((data) => components.assignToEntity(uid, data)))\n // Remove unwanted attributes\n .then(map(omitInvalidCreationAttributes))\n // Execute a strapi db createMany query with all the entities + their created components\n .then((data) => strapi.db.query(uid).createMany({ ...params, data }))\n );\n };\n\n const deleteMany = async <T extends object>(params?: T) => {\n const entitiesToDelete = await strapi.db.query(uid).findMany(params ?? {});\n\n if (!entitiesToDelete.length) {\n return null;\n }\n\n const componentsToDelete = await Promise.all(\n entitiesToDelete.map((entityToDelete) => components.get(uid, entityToDelete))\n );\n\n const deletedEntities = await strapi.db.query(uid).deleteMany(params);\n await Promise.all(componentsToDelete.map((compos) => components.delete(uid, compos)));\n\n return deletedEntities;\n };\n\n const getDeepPopulateComponentLikeQuery = (\n contentType: Struct.Schema,\n params = { select: '*' }\n ) => {\n const { attributes } = contentType;\n\n const populate: any = {};\n\n const entries: [string, any][] = Object.entries(attributes);\n\n for (const [key, attribute] of entries) {\n if (attribute.type === 'component') {\n const component = strapi.getModel(attribute.component);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {\n populate[key] = { ...params, populate: subPopulate };\n }\n\n if (isArray(subPopulate) && isEmpty(subPopulate)) {\n populate[key] = { ...params };\n }\n }\n\n if (attribute.type === 'dynamiczone') {\n const { components: componentsUID } = attribute;\n\n const on: any = {};\n\n for (const componentUID of componentsUID) {\n const component = strapi.getModel(componentUID);\n const subPopulate = getDeepPopulateComponentLikeQuery(component, params);\n\n if ((isArray(subPopulate) || isObject(subPopulate)) && size(subPopulate) > 0) {\n on[componentUID] = { ...params, populate: subPopulate };\n }\n\n if (isArray(subPopulate) && isEmpty(subPopulate)) {\n on[componentUID] = { ...params };\n }\n }\n\n populate[key] = size(on) > 0 ? { on } : true;\n }\n }\n\n const values = Object.values(populate);\n\n if (values.every((value) => value === true)) {\n return Object.keys(populate);\n }\n\n return populate;\n };\n\n return {\n create,\n createMany,\n deleteMany,\n getDeepPopulateComponentLikeQuery,\n\n get deepPopulateComponentLikeQuery() {\n const contentType = strapi.getModel(uid);\n\n return getDeepPopulateComponentLikeQuery(contentType);\n },\n };\n };\n\n return query;\n};\n\nexport { createEntityQuery };\n"],"names":["sanitizeComponentLikeAttributes","model","data","attributes","componentLikeAttributesKey","Object","entries","filter","attribute","type","map","key","omit","omitInvalidCreationAttributes","createEntityQuery","strapi","components","assignToEntity","uid","getModel","entityComponents","componentsService","dataWithoutComponents","assign","get","entity","delete","componentsToDelete","loadComponents","query","create","params","dataWithComponents","sanitizedData","db","createMany","Promise","resolve","then","deleteMany","entitiesToDelete","findMany","length","all","entityToDelete","deletedEntities","compos","getDeepPopulateComponentLikeQuery","contentType","select","populate","component","subPopulate","isArray","isObject","size","isEmpty","componentsUID","on","componentUID","values","every","value","keys","deepPopulateComponentLikeQuery"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|