@strapi/data-transfer 5.53.0 → 5.55.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.
- package/dist/directory/providers/destination/index.d.ts.map +1 -1
- package/dist/directory/providers/destination/index.js +11 -1
- package/dist/directory/providers/destination/index.js.map +1 -1
- package/dist/directory/providers/destination/index.mjs +11 -1
- package/dist/directory/providers/destination/index.mjs.map +1 -1
- package/dist/directory/providers/source/index.d.ts +2 -1
- package/dist/directory/providers/source/index.d.ts.map +1 -1
- package/dist/directory/providers/source/index.js +45 -12
- package/dist/directory/providers/source/index.js.map +1 -1
- package/dist/directory/providers/source/index.mjs +47 -14
- package/dist/directory/providers/source/index.mjs.map +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +62 -5
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/index.mjs +62 -5
- package/dist/engine/index.mjs.map +1 -1
- package/dist/file/providers/destination/index.d.ts.map +1 -1
- package/dist/file/providers/destination/index.js +11 -1
- package/dist/file/providers/destination/index.js.map +1 -1
- package/dist/file/providers/destination/index.mjs +11 -1
- package/dist/file/providers/destination/index.mjs.map +1 -1
- package/dist/file/providers/source/index.d.ts +2 -1
- package/dist/file/providers/source/index.d.ts.map +1 -1
- package/dist/file/providers/source/index.js +97 -8
- package/dist/file/providers/source/index.js.map +1 -1
- package/dist/file/providers/source/index.mjs +100 -11
- package/dist/file/providers/source/index.mjs.map +1 -1
- package/dist/file/providers/source/utils.d.ts +2 -0
- package/dist/file/providers/source/utils.d.ts.map +1 -1
- package/dist/file/providers/source/utils.js +43 -0
- package/dist/file/providers/source/utils.js.map +1 -1
- package/dist/file/providers/source/utils.mjs +43 -1
- package/dist/file/providers/source/utils.mjs.map +1 -1
- package/dist/strapi/providers/local-source/assets.js +2 -2
- package/dist/strapi/providers/local-source/assets.js.map +1 -1
- package/dist/strapi/providers/local-source/assets.mjs +2 -2
- package/dist/strapi/providers/local-source/assets.mjs.map +1 -1
- package/dist/types/providers.d.ts +10 -0
- package/dist/types/providers.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/directory/providers/destination/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAK5C,OAAO,KAAK,EAEV,oBAAoB,EACpB,mCAAmC,EACnC,SAAS,EACT,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,MAAM,WAAW,yCAAyC;IACxD,SAAS,EAAE;QACT,+EAA+E;QAC/E,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,iDACf,SAAQ,mCAAmC;IAC3C,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,eAAO,MAAM,uCAAuC,GAClD,SAAS,yCAAyC,sCAGnD,CAAC;AAEF,cAAM,iCAAkC,YAAW,oBAAoB;;IACrE,IAAI,SAAkC;IAEtC,IAAI,EAAE,YAAY,CAAiB;IAEnC,OAAO,EAAE,yCAAyC,CAAC;IAEnD,OAAO,EAAE,iDAAiD,CAAM;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/directory/providers/destination/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAK5C,OAAO,KAAK,EAEV,oBAAoB,EACpB,mCAAmC,EACnC,SAAS,EACT,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,MAAM,WAAW,yCAAyC;IACxD,SAAS,EAAE;QACT,+EAA+E;QAC/E,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,iDACf,SAAQ,mCAAmC;IAC3C,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,eAAO,MAAM,uCAAuC,GAClD,SAAS,yCAAyC,sCAGnD,CAAC;AAEF,cAAM,iCAAkC,YAAW,oBAAoB;;IACrE,IAAI,SAAkC;IAEtC,IAAI,EAAE,YAAY,CAAiB;IAEnC,OAAO,EAAE,yCAAyC,CAAC;IAEnD,OAAO,EAAE,iDAAiD,CAAM;gBAUpD,OAAO,EAAE,yCAAyC;IAgB9D,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,GAAG,oBAAoB;IAKtE,SAAS,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,KAAK;IAQL,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW;IAcX,wBAAwB;IAWxB,yBAAyB,IAAI,QAAQ;IAWrC,sBAAsB,IAAI,QAAQ;IAWlC,8BAA8B,IAAI,QAAQ;IAW1C,uBAAuB,IAAI,QAAQ;CAwCpC"}
|
|
@@ -28,7 +28,7 @@ function _class_private_field_loose_key(name) {
|
|
|
28
28
|
const createLocalDirectoryDestinationProvider = (options)=>{
|
|
29
29
|
return new LocalDirectoryDestinationProvider(options);
|
|
30
30
|
};
|
|
31
|
-
var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata");
|
|
31
|
+
var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _rolledBack = /*#__PURE__*/ _class_private_field_loose_key("_rolledBack"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata");
|
|
32
32
|
class LocalDirectoryDestinationProvider {
|
|
33
33
|
setMetadata(target, metadata) {
|
|
34
34
|
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata][target] = metadata;
|
|
@@ -36,6 +36,7 @@ class LocalDirectoryDestinationProvider {
|
|
|
36
36
|
}
|
|
37
37
|
async bootstrap(diagnostics) {
|
|
38
38
|
_class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
|
|
39
|
+
_class_private_field_loose_base(this, _rolledBack)[_rolledBack] = false;
|
|
39
40
|
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('preparing directory export');
|
|
40
41
|
await fs__default.default.mkdir(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], {
|
|
41
42
|
recursive: true
|
|
@@ -45,9 +46,13 @@ class LocalDirectoryDestinationProvider {
|
|
|
45
46
|
};
|
|
46
47
|
}
|
|
47
48
|
async close() {
|
|
49
|
+
if (_class_private_field_loose_base(this, _rolledBack)[_rolledBack]) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
48
52
|
await _class_private_field_loose_base(this, _writeMetadata)[_writeMetadata]();
|
|
49
53
|
}
|
|
50
54
|
async rollback() {
|
|
55
|
+
_class_private_field_loose_base(this, _rolledBack)[_rolledBack] = true;
|
|
51
56
|
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('rolling back');
|
|
52
57
|
await fs__default.default.rm(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], {
|
|
53
58
|
recursive: true,
|
|
@@ -150,10 +155,15 @@ class LocalDirectoryDestinationProvider {
|
|
|
150
155
|
writable: true,
|
|
151
156
|
value: void 0
|
|
152
157
|
});
|
|
158
|
+
Object.defineProperty(this, _rolledBack, {
|
|
159
|
+
writable: true,
|
|
160
|
+
value: void 0
|
|
161
|
+
});
|
|
153
162
|
this.name = 'destination::local-directory';
|
|
154
163
|
this.type = 'destination';
|
|
155
164
|
this.results = {};
|
|
156
165
|
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata] = {};
|
|
166
|
+
_class_private_field_loose_base(this, _rolledBack)[_rolledBack] = false;
|
|
157
167
|
this.options = options;
|
|
158
168
|
_class_private_field_loose_base(this, _rootResolved)[_rootResolved] = path__default.default.resolve(options.directory.path);
|
|
159
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/directory/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport { createWriteStream } from 'fs';\nimport { Writable, pipeline } from 'stream';\nimport fs from 'fs-extra';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createDirectoryJsonlWriter, createFilePathFactory } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalDirectoryDestinationProviderOptions {\n directory: {\n /** Output root: unpacked Strapi export layout (metadata.json, entities/, …) */\n path: string;\n };\n file: {\n maxSizeJsonl?: number;\n };\n}\n\nexport interface ILocalDirectoryDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalDirectoryDestinationProvider = (\n options: ILocalDirectoryDestinationProviderOptions\n) => {\n return new LocalDirectoryDestinationProvider(options);\n};\n\nclass LocalDirectoryDestinationProvider implements IDestinationProvider {\n name = 'destination::local-directory';\n\n type: ProviderType = 'destination';\n\n options: ILocalDirectoryDestinationProviderOptions;\n\n results: ILocalDirectoryDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #rootResolved: string;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalDirectoryDestinationProviderOptions) {\n this.options = options;\n this.#rootResolved = path.resolve(options.directory.path);\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'directory-destination-provider',\n },\n kind: 'info',\n });\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n return this;\n }\n\n async bootstrap(diagnostics: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.#reportInfo('preparing directory export');\n await fs.mkdir(this.#rootResolved, { recursive: true });\n this.results.file = { path: this.#rootResolved };\n }\n\n async close() {\n await this.#writeMetadata();\n }\n\n async rollback(): Promise<void> {\n this.#reportInfo('rolling back');\n await fs.rm(this.#rootResolved, { recursive: true, force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n if (metadata) {\n const target = path.join(this.#rootResolved, 'metadata.json');\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, JSON.stringify(metadata, null, 2), 'utf8');\n }\n }\n\n createSchemasWriteStream() {\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n this.#reportInfo('creating assets write stream');\n const root = this.#rootResolved;\n\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n const { filename } = data;\n const entryPath = path.join(root, 'assets', 'uploads', filename);\n const entryMetadataPath = path.join(root, 'assets', 'metadata', `${filename}.json`);\n\n const assetWriteError = (cause: unknown) =>\n new ProviderTransferError(`Failed to write asset ${filename}`, {\n details: {\n error: cause instanceof Error ? cause : new Error(String(cause)),\n },\n });\n\n let fileStream: ReturnType<typeof createWriteStream>;\n\n try {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n fs.mkdirSync(path.dirname(entryMetadataPath), { recursive: true });\n fs.writeFileSync(entryMetadataPath, JSON.stringify(data.metadata), 'utf8');\n fileStream = createWriteStream(entryPath);\n } catch (error: unknown) {\n callback(assetWriteError(error));\n return;\n }\n\n pipeline(data.stream, fileStream, (err) => {\n if (err) {\n callback(assetWriteError(err));\n return;\n }\n callback(null);\n });\n },\n });\n }\n}\n"],"names":["createLocalDirectoryDestinationProvider","options","LocalDirectoryDestinationProvider","setMetadata","target","metadata","bootstrap","diagnostics","fs","mkdir","recursive","results","file","path","close","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createDirectoryJsonlWriter","maxSizeJsonl","chain","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","root","Writable","objectMode","write","data","_encoding","callback","filename","entryPath","join","entryMetadataPath","assetWriteError","cause","ProviderTransferError","details","error","Error","String","fileStream","mkdirSync","dirname","writeFileSync","JSON","stringify","createWriteStream","pipeline","stream","err","name","type","resolve","directory","message","report","createdAt","Date","origin","kind","source","writeFile"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/directory/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport { createWriteStream } from 'fs';\nimport { Writable, pipeline } from 'stream';\nimport fs from 'fs-extra';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createDirectoryJsonlWriter, createFilePathFactory } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalDirectoryDestinationProviderOptions {\n directory: {\n /** Output root: unpacked Strapi export layout (metadata.json, entities/, …) */\n path: string;\n };\n file: {\n maxSizeJsonl?: number;\n };\n}\n\nexport interface ILocalDirectoryDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalDirectoryDestinationProvider = (\n options: ILocalDirectoryDestinationProviderOptions\n) => {\n return new LocalDirectoryDestinationProvider(options);\n};\n\nclass LocalDirectoryDestinationProvider implements IDestinationProvider {\n name = 'destination::local-directory';\n\n type: ProviderType = 'destination';\n\n options: ILocalDirectoryDestinationProviderOptions;\n\n results: ILocalDirectoryDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #rootResolved: string;\n\n #diagnostics?: IDiagnosticReporter;\n\n #rolledBack = false;\n\n constructor(options: ILocalDirectoryDestinationProviderOptions) {\n this.options = options;\n this.#rootResolved = path.resolve(options.directory.path);\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'directory-destination-provider',\n },\n kind: 'info',\n });\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n return this;\n }\n\n async bootstrap(diagnostics: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.#rolledBack = false;\n this.#reportInfo('preparing directory export');\n await fs.mkdir(this.#rootResolved, { recursive: true });\n this.results.file = { path: this.#rootResolved };\n }\n\n async close() {\n if (this.#rolledBack) {\n return;\n }\n\n await this.#writeMetadata();\n }\n\n async rollback(): Promise<void> {\n this.#rolledBack = true;\n this.#reportInfo('rolling back');\n await fs.rm(this.#rootResolved, { recursive: true, force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n if (metadata) {\n const target = path.join(this.#rootResolved, 'metadata.json');\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, JSON.stringify(metadata, null, 2), 'utf8');\n }\n }\n\n createSchemasWriteStream() {\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n this.#reportInfo('creating assets write stream');\n const root = this.#rootResolved;\n\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n const { filename } = data;\n const entryPath = path.join(root, 'assets', 'uploads', filename);\n const entryMetadataPath = path.join(root, 'assets', 'metadata', `${filename}.json`);\n\n const assetWriteError = (cause: unknown) =>\n new ProviderTransferError(`Failed to write asset ${filename}`, {\n details: {\n error: cause instanceof Error ? cause : new Error(String(cause)),\n },\n });\n\n let fileStream: ReturnType<typeof createWriteStream>;\n\n try {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n fs.mkdirSync(path.dirname(entryMetadataPath), { recursive: true });\n fs.writeFileSync(entryMetadataPath, JSON.stringify(data.metadata), 'utf8');\n fileStream = createWriteStream(entryPath);\n } catch (error: unknown) {\n callback(assetWriteError(error));\n return;\n }\n\n pipeline(data.stream, fileStream, (err) => {\n if (err) {\n callback(assetWriteError(err));\n return;\n }\n callback(null);\n });\n },\n });\n }\n}\n"],"names":["createLocalDirectoryDestinationProvider","options","LocalDirectoryDestinationProvider","setMetadata","target","metadata","bootstrap","diagnostics","fs","mkdir","recursive","results","file","path","close","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createDirectoryJsonlWriter","maxSizeJsonl","chain","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","root","Writable","objectMode","write","data","_encoding","callback","filename","entryPath","join","entryMetadataPath","assetWriteError","cause","ProviderTransferError","details","error","Error","String","fileStream","mkdirSync","dirname","writeFileSync","JSON","stringify","createWriteStream","pipeline","stream","err","name","type","resolve","directory","message","report","createdAt","Date","origin","kind","source","writeFile"],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ function _class_private_field_loose_key(name) {
|
|
|
21
21
|
const createLocalDirectoryDestinationProvider = (options)=>{
|
|
22
22
|
return new LocalDirectoryDestinationProvider(options);
|
|
23
23
|
};
|
|
24
|
-
var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata");
|
|
24
|
+
var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _rolledBack = /*#__PURE__*/ _class_private_field_loose_key("_rolledBack"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata");
|
|
25
25
|
class LocalDirectoryDestinationProvider {
|
|
26
26
|
setMetadata(target, metadata) {
|
|
27
27
|
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata][target] = metadata;
|
|
@@ -29,6 +29,7 @@ class LocalDirectoryDestinationProvider {
|
|
|
29
29
|
}
|
|
30
30
|
async bootstrap(diagnostics) {
|
|
31
31
|
_class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
|
|
32
|
+
_class_private_field_loose_base(this, _rolledBack)[_rolledBack] = false;
|
|
32
33
|
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('preparing directory export');
|
|
33
34
|
await fs__default.mkdir(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], {
|
|
34
35
|
recursive: true
|
|
@@ -38,9 +39,13 @@ class LocalDirectoryDestinationProvider {
|
|
|
38
39
|
};
|
|
39
40
|
}
|
|
40
41
|
async close() {
|
|
42
|
+
if (_class_private_field_loose_base(this, _rolledBack)[_rolledBack]) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
41
45
|
await _class_private_field_loose_base(this, _writeMetadata)[_writeMetadata]();
|
|
42
46
|
}
|
|
43
47
|
async rollback() {
|
|
48
|
+
_class_private_field_loose_base(this, _rolledBack)[_rolledBack] = true;
|
|
44
49
|
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('rolling back');
|
|
45
50
|
await fs__default.rm(_class_private_field_loose_base(this, _rootResolved)[_rootResolved], {
|
|
46
51
|
recursive: true,
|
|
@@ -143,10 +148,15 @@ class LocalDirectoryDestinationProvider {
|
|
|
143
148
|
writable: true,
|
|
144
149
|
value: void 0
|
|
145
150
|
});
|
|
151
|
+
Object.defineProperty(this, _rolledBack, {
|
|
152
|
+
writable: true,
|
|
153
|
+
value: void 0
|
|
154
|
+
});
|
|
146
155
|
this.name = 'destination::local-directory';
|
|
147
156
|
this.type = 'destination';
|
|
148
157
|
this.results = {};
|
|
149
158
|
_class_private_field_loose_base(this, _providersMetadata)[_providersMetadata] = {};
|
|
159
|
+
_class_private_field_loose_base(this, _rolledBack)[_rolledBack] = false;
|
|
150
160
|
this.options = options;
|
|
151
161
|
_class_private_field_loose_base(this, _rootResolved)[_rootResolved] = path.resolve(options.directory.path);
|
|
152
162
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/directory/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport { createWriteStream } from 'fs';\nimport { Writable, pipeline } from 'stream';\nimport fs from 'fs-extra';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createDirectoryJsonlWriter, createFilePathFactory } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalDirectoryDestinationProviderOptions {\n directory: {\n /** Output root: unpacked Strapi export layout (metadata.json, entities/, …) */\n path: string;\n };\n file: {\n maxSizeJsonl?: number;\n };\n}\n\nexport interface ILocalDirectoryDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalDirectoryDestinationProvider = (\n options: ILocalDirectoryDestinationProviderOptions\n) => {\n return new LocalDirectoryDestinationProvider(options);\n};\n\nclass LocalDirectoryDestinationProvider implements IDestinationProvider {\n name = 'destination::local-directory';\n\n type: ProviderType = 'destination';\n\n options: ILocalDirectoryDestinationProviderOptions;\n\n results: ILocalDirectoryDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #rootResolved: string;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalDirectoryDestinationProviderOptions) {\n this.options = options;\n this.#rootResolved = path.resolve(options.directory.path);\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'directory-destination-provider',\n },\n kind: 'info',\n });\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n return this;\n }\n\n async bootstrap(diagnostics: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.#reportInfo('preparing directory export');\n await fs.mkdir(this.#rootResolved, { recursive: true });\n this.results.file = { path: this.#rootResolved };\n }\n\n async close() {\n await this.#writeMetadata();\n }\n\n async rollback(): Promise<void> {\n this.#reportInfo('rolling back');\n await fs.rm(this.#rootResolved, { recursive: true, force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n if (metadata) {\n const target = path.join(this.#rootResolved, 'metadata.json');\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, JSON.stringify(metadata, null, 2), 'utf8');\n }\n }\n\n createSchemasWriteStream() {\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n this.#reportInfo('creating assets write stream');\n const root = this.#rootResolved;\n\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n const { filename } = data;\n const entryPath = path.join(root, 'assets', 'uploads', filename);\n const entryMetadataPath = path.join(root, 'assets', 'metadata', `${filename}.json`);\n\n const assetWriteError = (cause: unknown) =>\n new ProviderTransferError(`Failed to write asset ${filename}`, {\n details: {\n error: cause instanceof Error ? cause : new Error(String(cause)),\n },\n });\n\n let fileStream: ReturnType<typeof createWriteStream>;\n\n try {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n fs.mkdirSync(path.dirname(entryMetadataPath), { recursive: true });\n fs.writeFileSync(entryMetadataPath, JSON.stringify(data.metadata), 'utf8');\n fileStream = createWriteStream(entryPath);\n } catch (error: unknown) {\n callback(assetWriteError(error));\n return;\n }\n\n pipeline(data.stream, fileStream, (err) => {\n if (err) {\n callback(assetWriteError(err));\n return;\n }\n callback(null);\n });\n },\n });\n }\n}\n"],"names":["createLocalDirectoryDestinationProvider","options","LocalDirectoryDestinationProvider","setMetadata","target","metadata","bootstrap","diagnostics","fs","mkdir","recursive","results","file","path","close","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createDirectoryJsonlWriter","maxSizeJsonl","chain","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","root","Writable","objectMode","write","data","_encoding","callback","filename","entryPath","join","entryMetadataPath","assetWriteError","cause","ProviderTransferError","details","error","Error","String","fileStream","mkdirSync","dirname","writeFileSync","JSON","stringify","createWriteStream","pipeline","stream","err","name","type","resolve","directory","message","report","createdAt","Date","origin","kind","source","writeFile"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmCO,MAAMA,0CAA0C,CACrDC,OAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,iCAAAA,CAAkCD,OAAAA,CAAAA;AAC/C;IAWE,kBAAA,iBAAA,8BAAA,CAAA,oBAAA,CAAA,EAEA,aAAA,iBAAA,8BAAA,CAAA,eAAA,CAAA,EAEA,6EAOA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,EAoCM,cAAA,iBAAA,8BAAA,CAAA,gBAAA,CAAA;AAxDR,MAAMC,iCAAAA,CAAAA;IA+BJC,WAAAA,CAAYC,MAAoB,EAAEC,QAAmB,EAAwB;AAC3E,QAAA,+BAAA,CAAA,IAAI,EAAC,kBAAA,CAAA,CAAA,kBAAA,CAAkB,CAACD,OAAO,GAAGC,QAAAA;AAClC,QAAA,OAAO,IAAI;AACb,IAAA;IAEA,MAAMC,SAAAA,CAAUC,WAAgC,EAAiB;QAC/D,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,GAAeA,WAAAA;QACpB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,4BAAA,CAAA;AACjB,QAAA,MAAMC,YAAGC,KAAK,CAAC,gCAAA,IAAI,EAAC,eAAA,aAAA,CAAA,EAAe;YAAEC,SAAAA,EAAW;AAAK,SAAA,CAAA;AACrD,QAAA,IAAI,CAACC,OAAO,CAACC,IAAI,GAAG;AAAEC,YAAAA,IAAI,EAAE,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA;AAAc,SAAA;AACjD,IAAA;AAEA,IAAA,MAAMC,KAAAA,GAAQ;QACZ,MAAM,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,EAAA;AACb,IAAA;AAEA,IAAA,MAAMC,QAAAA,GAA0B;QAC9B,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,cAAA,CAAA;AACjB,QAAA,MAAMP,YAAGQ,EAAE,CAAC,gCAAA,IAAI,EAAC,eAAA,aAAA,CAAA,EAAe;YAAEN,SAAAA,EAAW,IAAA;YAAMO,KAAAA,EAAO;AAAK,SAAA,CAAA;AACjE,IAAA;IAEAC,WAAAA,GAAc;QACZ,OAAO,IAAA;AACT,IAAA;IAYAC,wBAAAA,GAA2B;QACzB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,+BAAA,CAAA;AACjB,QAAA,MAAMC,kBAAkBC,qBAAAA,CAAsB,SAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAK,yBAAAA,GAAsC;QACpC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,gCAAA,CAAA;AACjB,QAAA,MAAMP,kBAAkBC,qBAAAA,CAAsB,UAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAM,sBAAAA,GAAmC;QACjC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,6BAAA,CAAA;AACjB,QAAA,MAAMR,kBAAkBC,qBAAAA,CAAsB,OAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAO,8BAAAA,GAA2C;QACzC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qCAAA,CAAA;AACjB,QAAA,MAAMT,kBAAkBC,qBAAAA,CAAsB,eAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAQ,uBAAAA,GAAoC;QAClC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,8BAAA,CAAA;AACjB,QAAA,MAAMC,IAAAA,GAAO,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA;AAElB,QAAA,OAAO,IAAIC,QAAAA,CAAS;YAClBC,UAAAA,EAAY,IAAA;AACZC,YAAAA,KAAAA,CAAAA,CAAMC,IAAY,EAAEC,SAAS,EAAEC,QAAQ,EAAA;gBACrC,MAAM,EAAEC,QAAQ,EAAE,GAAGH,IAAAA;AACrB,gBAAA,MAAMI,YAAY1B,IAAAA,CAAK2B,IAAI,CAACT,IAAAA,EAAM,UAAU,SAAA,EAAWO,QAAAA,CAAAA;gBACvD,MAAMG,iBAAAA,GAAoB5B,IAAAA,CAAK2B,IAAI,CAACT,IAAAA,EAAM,UAAU,UAAA,EAAY,CAAA,EAAGO,QAAAA,CAAS,KAAK,CAAC,CAAA;gBAElF,MAAMI,eAAAA,GAAkB,CAACC,KAAAA,GACvB,IAAIC,sBAAsB,CAAC,sBAAsB,EAAEN,QAAAA,CAAAA,CAAU,EAAE;wBAC7DO,OAAAA,EAAS;AACPC,4BAAAA,KAAAA,EAAOH,KAAAA,YAAiBI,KAAAA,GAAQJ,KAAAA,GAAQ,IAAII,MAAMC,MAAAA,CAAOL,KAAAA,CAAAA;AAC3D;AACF,qBAAA,CAAA;gBAEF,IAAIM,UAAAA;gBAEJ,IAAI;AACFzC,oBAAAA,WAAAA,CAAG0C,SAAS,CAACrC,IAAAA,CAAKsC,OAAO,CAACZ,SAAAA,CAAAA,EAAY;wBAAE7B,SAAAA,EAAW;AAAK,qBAAA,CAAA;AACxDF,oBAAAA,WAAAA,CAAG0C,SAAS,CAACrC,IAAAA,CAAKsC,OAAO,CAACV,iBAAAA,CAAAA,EAAoB;wBAAE/B,SAAAA,EAAW;AAAK,qBAAA,CAAA;oBAChEF,WAAAA,CAAG4C,aAAa,CAACX,iBAAAA,EAAmBY,IAAAA,CAAKC,SAAS,CAACnB,IAAAA,CAAK9B,QAAQ,CAAA,EAAG,MAAA,CAAA;AACnE4C,oBAAAA,UAAAA,GAAaM,iBAAAA,CAAkBhB,SAAAA,CAAAA;AACjC,gBAAA,CAAA,CAAE,OAAOO,KAAAA,EAAgB;AACvBT,oBAAAA,QAAAA,CAASK,eAAAA,CAAgBI,KAAAA,CAAAA,CAAAA;AACzB,oBAAA;AACF,gBAAA;AAEAU,gBAAAA,QAAAA,CAASrB,IAAAA,CAAKsB,MAAM,EAAER,UAAAA,EAAY,CAACS,GAAAA,GAAAA;AACjC,oBAAA,IAAIA,GAAAA,EAAK;AACPrB,wBAAAA,QAAAA,CAASK,eAAAA,CAAgBgB,GAAAA,CAAAA,CAAAA;AACzB,wBAAA;AACF,oBAAA;oBACArB,QAAAA,CAAS,IAAA,CAAA;AACX,gBAAA,CAAA,CAAA;AACF,YAAA;AACF,SAAA,CAAA;AACF,IAAA;AAtIA,IAAA,WAAA,CAAYpC,OAAkD,CAAE;QAKhE,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAoCA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,cAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QA/CA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,kBAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,aAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;aAZA0D,IAAAA,GAAO,8BAAA;aAEPC,IAAAA,GAAqB,aAAA;AAIrBjD,QAAAA,IAAAA,CAAAA,OAAAA,GAA6D,EAAC;AAE9D,QAAA,+BAAA,CAAA,IAAA,EAAA,kBAAA,CAAA,CAAA,sBAAsE,EAAC;QAOrE,IAAI,CAACV,OAAO,GAAGA,OAAAA;QACf,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,GAAgBY,IAAAA,CAAKgD,OAAO,CAAC5D,OAAAA,CAAQ6D,SAAS,CAACjD,IAAI,CAAA;AAC1D,IAAA;AAoIF;AAlIE,SAAA,WAAYkD,OAAe,EAAA;AACzB,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAcC,MAAAA,CAAO;QACxBnB,OAAAA,EAAS;AACPoB,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfH,YAAAA,OAAAA;YACAI,MAAAA,EAAQ;AACV,SAAA;QACAC,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AA2BA,eAAA,aAAA,GAAA;IACE,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,kBAAA,CAAA;AACjB,IAAA,MAAM/D,WAAW,+BAAA,CAAA,IAAI,EAAC,kBAAA,CAAA,CAAA,oBAAmBgE,MAAM;AAC/C,IAAA,IAAIhE,QAAAA,EAAU;QACZ,MAAMD,MAAAA,GAASS,KAAK2B,IAAI,CAAC,gCAAA,IAAI,EAAC,eAAA,aAAA,CAAA,EAAe,eAAA,CAAA;AAC7C,QAAA,MAAMhC,YAAGC,KAAK,CAACI,IAAAA,CAAKsC,OAAO,CAAC/C,MAAAA,CAAAA,EAAS;YAAEM,SAAAA,EAAW;AAAK,SAAA,CAAA;QACvD,MAAMF,WAAAA,CAAG8D,SAAS,CAAClE,MAAAA,EAAQiD,KAAKC,SAAS,CAACjD,QAAAA,EAAU,IAAA,EAAM,CAAA,CAAA,EAAI,MAAA,CAAA;AAChE,IAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/directory/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport { createWriteStream } from 'fs';\nimport { Writable, pipeline } from 'stream';\nimport fs from 'fs-extra';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createDirectoryJsonlWriter, createFilePathFactory } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalDirectoryDestinationProviderOptions {\n directory: {\n /** Output root: unpacked Strapi export layout (metadata.json, entities/, …) */\n path: string;\n };\n file: {\n maxSizeJsonl?: number;\n };\n}\n\nexport interface ILocalDirectoryDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalDirectoryDestinationProvider = (\n options: ILocalDirectoryDestinationProviderOptions\n) => {\n return new LocalDirectoryDestinationProvider(options);\n};\n\nclass LocalDirectoryDestinationProvider implements IDestinationProvider {\n name = 'destination::local-directory';\n\n type: ProviderType = 'destination';\n\n options: ILocalDirectoryDestinationProviderOptions;\n\n results: ILocalDirectoryDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #rootResolved: string;\n\n #diagnostics?: IDiagnosticReporter;\n\n #rolledBack = false;\n\n constructor(options: ILocalDirectoryDestinationProviderOptions) {\n this.options = options;\n this.#rootResolved = path.resolve(options.directory.path);\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'directory-destination-provider',\n },\n kind: 'info',\n });\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n return this;\n }\n\n async bootstrap(diagnostics: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n this.#rolledBack = false;\n this.#reportInfo('preparing directory export');\n await fs.mkdir(this.#rootResolved, { recursive: true });\n this.results.file = { path: this.#rootResolved };\n }\n\n async close() {\n if (this.#rolledBack) {\n return;\n }\n\n await this.#writeMetadata();\n }\n\n async rollback(): Promise<void> {\n this.#rolledBack = true;\n this.#reportInfo('rolling back');\n await fs.rm(this.#rootResolved, { recursive: true, force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n if (metadata) {\n const target = path.join(this.#rootResolved, 'metadata.json');\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, JSON.stringify(metadata, null, 2), 'utf8');\n }\n }\n\n createSchemasWriteStream() {\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n const entryStream = createDirectoryJsonlWriter(\n this.#rootResolved,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n this.#reportInfo('creating assets write stream');\n const root = this.#rootResolved;\n\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n const { filename } = data;\n const entryPath = path.join(root, 'assets', 'uploads', filename);\n const entryMetadataPath = path.join(root, 'assets', 'metadata', `${filename}.json`);\n\n const assetWriteError = (cause: unknown) =>\n new ProviderTransferError(`Failed to write asset ${filename}`, {\n details: {\n error: cause instanceof Error ? cause : new Error(String(cause)),\n },\n });\n\n let fileStream: ReturnType<typeof createWriteStream>;\n\n try {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n fs.mkdirSync(path.dirname(entryMetadataPath), { recursive: true });\n fs.writeFileSync(entryMetadataPath, JSON.stringify(data.metadata), 'utf8');\n fileStream = createWriteStream(entryPath);\n } catch (error: unknown) {\n callback(assetWriteError(error));\n return;\n }\n\n pipeline(data.stream, fileStream, (err) => {\n if (err) {\n callback(assetWriteError(err));\n return;\n }\n callback(null);\n });\n },\n });\n }\n}\n"],"names":["createLocalDirectoryDestinationProvider","options","LocalDirectoryDestinationProvider","setMetadata","target","metadata","bootstrap","diagnostics","fs","mkdir","recursive","results","file","path","close","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createDirectoryJsonlWriter","maxSizeJsonl","chain","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","root","Writable","objectMode","write","data","_encoding","callback","filename","entryPath","join","entryMetadataPath","assetWriteError","cause","ProviderTransferError","details","error","Error","String","fileStream","mkdirSync","dirname","writeFileSync","JSON","stringify","createWriteStream","pipeline","stream","err","name","type","resolve","directory","message","report","createdAt","Date","origin","kind","source","writeFile"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmCO,MAAMA,0CAA0C,CACrDC,OAAAA,GAAAA;AAEA,IAAA,OAAO,IAAIC,iCAAAA,CAAkCD,OAAAA,CAAAA;AAC/C;IAWE,kBAAA,iBAAA,8BAAA,CAAA,oBAAA,CAAA,EAEA,aAAA,iBAAA,8BAAA,CAAA,eAAA,CAAA,EAEA,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAEA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,EAOA,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,EA0CM,cAAA,iBAAA,8BAAA,CAAA,gBAAA,CAAA;AAhER,MAAMC,iCAAAA,CAAAA;IAiCJC,WAAAA,CAAYC,MAAoB,EAAEC,QAAmB,EAAwB;AAC3E,QAAA,+BAAA,CAAA,IAAI,EAAC,kBAAA,CAAA,CAAA,kBAAA,CAAkB,CAACD,OAAO,GAAGC,QAAAA;AAClC,QAAA,OAAO,IAAI;AACb,IAAA;IAEA,MAAMC,SAAAA,CAAUC,WAAgC,EAAiB;QAC/D,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,GAAeA,WAAAA;QACpB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,GAAc,KAAA;QACnB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,4BAAA,CAAA;AACjB,QAAA,MAAMC,YAAGC,KAAK,CAAC,gCAAA,IAAI,EAAC,eAAA,aAAA,CAAA,EAAe;YAAEC,SAAAA,EAAW;AAAK,SAAA,CAAA;AACrD,QAAA,IAAI,CAACC,OAAO,CAACC,IAAI,GAAG;AAAEC,YAAAA,IAAI,EAAE,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA;AAAc,SAAA;AACjD,IAAA;AAEA,IAAA,MAAMC,KAAAA,GAAQ;AACZ,QAAA,IAAI,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,EAAa;AACpB,YAAA;AACF,QAAA;QAEA,MAAM,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,EAAA;AACb,IAAA;AAEA,IAAA,MAAMC,QAAAA,GAA0B;QAC9B,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,GAAc,IAAA;QACnB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,cAAA,CAAA;AACjB,QAAA,MAAMP,YAAGQ,EAAE,CAAC,gCAAA,IAAI,EAAC,eAAA,aAAA,CAAA,EAAe;YAAEN,SAAAA,EAAW,IAAA;YAAMO,KAAAA,EAAO;AAAK,SAAA,CAAA;AACjE,IAAA;IAEAC,WAAAA,GAAc;QACZ,OAAO,IAAA;AACT,IAAA;IAYAC,wBAAAA,GAA2B;QACzB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,+BAAA,CAAA;AACjB,QAAA,MAAMC,kBAAkBC,qBAAAA,CAAsB,SAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAK,yBAAAA,GAAsC;QACpC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,gCAAA,CAAA;AACjB,QAAA,MAAMP,kBAAkBC,qBAAAA,CAAsB,UAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAM,sBAAAA,GAAmC;QACjC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,6BAAA,CAAA;AACjB,QAAA,MAAMR,kBAAkBC,qBAAAA,CAAsB,OAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAO,8BAAAA,GAA2C;QACzC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qCAAA,CAAA;AACjB,QAAA,MAAMT,kBAAkBC,qBAAAA,CAAsB,eAAA,CAAA;AAC9C,QAAA,MAAMC,WAAAA,GAAcC,0BAAAA,CAClB,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,EACLH,eAAAA,EACA,IAAI,CAACnB,OAAO,CAACW,IAAI,CAACY,YAAY,CAAA;AAEhC,QAAA,OAAOC,KAAAA,CAAM;AAACC,YAAAA,QAAAA,EAAAA;AAAYJ,YAAAA;AAAY,SAAA,CAAA;AACxC,IAAA;IAEAQ,uBAAAA,GAAoC;QAClC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,8BAAA,CAAA;AACjB,QAAA,MAAMC,IAAAA,GAAO,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA;AAElB,QAAA,OAAO,IAAIC,QAAAA,CAAS;YAClBC,UAAAA,EAAY,IAAA;AACZC,YAAAA,KAAAA,CAAAA,CAAMC,IAAY,EAAEC,SAAS,EAAEC,QAAQ,EAAA;gBACrC,MAAM,EAAEC,QAAQ,EAAE,GAAGH,IAAAA;AACrB,gBAAA,MAAMI,YAAY1B,IAAAA,CAAK2B,IAAI,CAACT,IAAAA,EAAM,UAAU,SAAA,EAAWO,QAAAA,CAAAA;gBACvD,MAAMG,iBAAAA,GAAoB5B,IAAAA,CAAK2B,IAAI,CAACT,IAAAA,EAAM,UAAU,UAAA,EAAY,CAAA,EAAGO,QAAAA,CAAS,KAAK,CAAC,CAAA;gBAElF,MAAMI,eAAAA,GAAkB,CAACC,KAAAA,GACvB,IAAIC,sBAAsB,CAAC,sBAAsB,EAAEN,QAAAA,CAAAA,CAAU,EAAE;wBAC7DO,OAAAA,EAAS;AACPC,4BAAAA,KAAAA,EAAOH,KAAAA,YAAiBI,KAAAA,GAAQJ,KAAAA,GAAQ,IAAII,MAAMC,MAAAA,CAAOL,KAAAA,CAAAA;AAC3D;AACF,qBAAA,CAAA;gBAEF,IAAIM,UAAAA;gBAEJ,IAAI;AACFzC,oBAAAA,WAAAA,CAAG0C,SAAS,CAACrC,IAAAA,CAAKsC,OAAO,CAACZ,SAAAA,CAAAA,EAAY;wBAAE7B,SAAAA,EAAW;AAAK,qBAAA,CAAA;AACxDF,oBAAAA,WAAAA,CAAG0C,SAAS,CAACrC,IAAAA,CAAKsC,OAAO,CAACV,iBAAAA,CAAAA,EAAoB;wBAAE/B,SAAAA,EAAW;AAAK,qBAAA,CAAA;oBAChEF,WAAAA,CAAG4C,aAAa,CAACX,iBAAAA,EAAmBY,IAAAA,CAAKC,SAAS,CAACnB,IAAAA,CAAK9B,QAAQ,CAAA,EAAG,MAAA,CAAA;AACnE4C,oBAAAA,UAAAA,GAAaM,iBAAAA,CAAkBhB,SAAAA,CAAAA;AACjC,gBAAA,CAAA,CAAE,OAAOO,KAAAA,EAAgB;AACvBT,oBAAAA,QAAAA,CAASK,eAAAA,CAAgBI,KAAAA,CAAAA,CAAAA;AACzB,oBAAA;AACF,gBAAA;AAEAU,gBAAAA,QAAAA,CAASrB,IAAAA,CAAKsB,MAAM,EAAER,UAAAA,EAAY,CAACS,GAAAA,GAAAA;AACjC,oBAAA,IAAIA,GAAAA,EAAK;AACPrB,wBAAAA,QAAAA,CAASK,eAAAA,CAAgBgB,GAAAA,CAAAA,CAAAA;AACzB,wBAAA;AACF,oBAAA;oBACArB,QAAAA,CAAS,IAAA,CAAA;AACX,gBAAA,CAAA,CAAA;AACF,YAAA;AACF,SAAA,CAAA;AACF,IAAA;AA5IA,IAAA,WAAA,CAAYpC,OAAkD,CAAE;QAKhE,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QA0CA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,cAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAvDA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,kBAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,aAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;;mBAAA;;aAdA0D,IAAAA,GAAO,8BAAA;aAEPC,IAAAA,GAAqB,aAAA;AAIrBjD,QAAAA,IAAAA,CAAAA,OAAAA,GAA6D,EAAC;AAE9D,QAAA,+BAAA,CAAA,IAAA,EAAA,kBAAA,CAAA,CAAA,sBAAsE,EAAC;AAMvE,QAAA,+BAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA,WAAA,CAAA,GAAc,KAAA;QAGZ,IAAI,CAACV,OAAO,GAAGA,OAAAA;QACf,+BAAA,CAAA,IAAI,EAAC,aAAA,CAAA,CAAA,aAAA,CAAA,GAAgBY,IAAAA,CAAKgD,OAAO,CAAC5D,OAAAA,CAAQ6D,SAAS,CAACjD,IAAI,CAAA;AAC1D,IAAA;AA0IF;AAxIE,SAAA,WAAYkD,OAAe,EAAA;AACzB,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAcC,MAAAA,CAAO;QACxBnB,OAAAA,EAAS;AACPoB,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACfH,YAAAA,OAAAA;YACAI,MAAAA,EAAQ;AACV,SAAA;QACAC,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAiCA,eAAA,aAAA,GAAA;IACE,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,kBAAA,CAAA;AACjB,IAAA,MAAM/D,WAAW,+BAAA,CAAA,IAAI,EAAC,kBAAA,CAAA,CAAA,oBAAmBgE,MAAM;AAC/C,IAAA,IAAIhE,QAAAA,EAAU;QACZ,MAAMD,MAAAA,GAASS,KAAK2B,IAAI,CAAC,gCAAA,IAAI,EAAC,eAAA,aAAA,CAAA,EAAe,eAAA,CAAA;AAC7C,QAAA,MAAMhC,YAAGC,KAAK,CAACI,IAAAA,CAAKsC,OAAO,CAAC/C,MAAAA,CAAAA,EAAS;YAAEM,SAAAA,EAAW;AAAK,SAAA,CAAA;QACvD,MAAMF,WAAAA,CAAG8D,SAAS,CAAClE,MAAAA,EAAQiD,KAAKC,SAAS,CAACjD,QAAAA,EAAU,IAAA,EAAM,CAAA,CAAA,EAAI,MAAA,CAAA;AAChE,IAAA;AACF;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Readable } from 'stream';
|
|
2
|
-
import type { IMetadata, ISourceProvider, ProviderType } from '../../../types';
|
|
2
|
+
import type { IMetadata, ISourceProvider, ProviderType, TransferStage } from '../../../types';
|
|
3
3
|
import type { IDiagnosticReporter } from '../../../utils/diagnostic';
|
|
4
4
|
export interface ILocalDirectorySourceProviderOptions {
|
|
5
5
|
directory: {
|
|
@@ -17,6 +17,7 @@ declare class LocalDirectorySourceProvider implements ISourceProvider {
|
|
|
17
17
|
bootstrap(diagnostics: IDiagnosticReporter): Promise<void>;
|
|
18
18
|
getMetadata(): Promise<IMetadata | null>;
|
|
19
19
|
getSchemas(): Promise<any>;
|
|
20
|
+
validateStage(stage: TransferStage): Promise<void>;
|
|
20
21
|
createEntitiesReadStream(): Readable;
|
|
21
22
|
createSchemasReadStream(): Readable;
|
|
22
23
|
createLinksReadStream(): Readable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/directory/providers/source/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AASvC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/directory/providers/source/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AASvC,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EACf,YAAY,EACZ,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAarE,MAAM,WAAW,oCAAoC;IACnD,SAAS,EAAE;QACT,uFAAuF;QACvF,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,eAAO,MAAM,kCAAkC,GAC7C,SAAS,oCAAoC,iCAG9C,CAAC;AAOF,cAAM,4BAA6B,YAAW,eAAe;;IAC3D,IAAI,EAAE,YAAY,CAAY;IAE9B,IAAI,SAA6B;IAEjC,OAAO,EAAE,oCAAoC,CAAC;gBAUlC,OAAO,EAAE,oCAAoC;IA2BnD,SAAS,CAAC,WAAW,EAAE,mBAAmB;IAkC1C,WAAW;IAQX,UAAU;IAcV,aAAa,CAAC,KAAK,EAAE,aAAa;IAiCxC,wBAAwB,IAAI,QAAQ;IAKpC,uBAAuB,IAAI,QAAQ;IAKnC,qBAAqB,IAAI,QAAQ;IAKjC,6BAA6B,IAAI,QAAQ;IAKzC,sBAAsB,IAAI,QAAQ;CAgHnC"}
|
|
@@ -37,7 +37,7 @@ const isPathInsideRoot = (root, candidate)=>{
|
|
|
37
37
|
const relative = path__default.default.relative(root, candidate);
|
|
38
38
|
return relative === '' || !relative.startsWith(`..${path__default.default.sep}`) && !path__default.default.isAbsolute(relative);
|
|
39
39
|
};
|
|
40
|
-
var _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _metadata = /*#__PURE__*/ _class_private_field_loose_key("_metadata"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), /** Resolve a posix-style relative path under the export root; rejects escapes. */ _safePath = /*#__PURE__*/ _class_private_field_loose_key("_safePath"), _loadMetadata = /*#__PURE__*/ _class_private_field_loose_key("_loadMetadata"), _pipeAssetsToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeAssetsToStream"), _readAssetMetadata = /*#__PURE__*/ _class_private_field_loose_key("_readAssetMetadata"), _listJsonlFiles = /*#__PURE__*/ _class_private_field_loose_key("_listJsonlFiles"), _streamJsonlDirectory = /*#__PURE__*/ _class_private_field_loose_key("_streamJsonlDirectory"), _pipeJsonlDirectoryToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeJsonlDirectoryToStream");
|
|
40
|
+
var _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _metadata = /*#__PURE__*/ _class_private_field_loose_key("_metadata"), _assetMetadata = /*#__PURE__*/ _class_private_field_loose_key("_assetMetadata"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), /** Resolve a posix-style relative path under the export root; rejects escapes. */ _safePath = /*#__PURE__*/ _class_private_field_loose_key("_safePath"), _loadMetadata = /*#__PURE__*/ _class_private_field_loose_key("_loadMetadata"), _pipeAssetsToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeAssetsToStream"), _readAssetMetadata = /*#__PURE__*/ _class_private_field_loose_key("_readAssetMetadata"), _listJsonlFiles = /*#__PURE__*/ _class_private_field_loose_key("_listJsonlFiles"), _streamJsonlDirectory = /*#__PURE__*/ _class_private_field_loose_key("_streamJsonlDirectory"), _pipeJsonlDirectoryToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeJsonlDirectoryToStream");
|
|
41
41
|
class LocalDirectorySourceProvider {
|
|
42
42
|
async bootstrap(diagnostics) {
|
|
43
43
|
_class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
|
|
@@ -74,6 +74,33 @@ class LocalDirectorySourceProvider {
|
|
|
74
74
|
const schemas = fp.keyBy('uid', schemaCollection);
|
|
75
75
|
return schema.schemasToValidJSON(schemas);
|
|
76
76
|
}
|
|
77
|
+
async validateStage(stage) {
|
|
78
|
+
if (stage !== 'assets') {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const uploadsDir = _class_private_field_loose_base(this, _safePath)[_safePath]('assets', 'uploads');
|
|
82
|
+
if (!await fs__default.default.pathExists(uploadsDir)) {
|
|
83
|
+
_class_private_field_loose_base(this, _assetMetadata)[_assetMetadata] = new Map();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const metadata = new Map();
|
|
87
|
+
const names = (await fs__default.default.readdir(uploadsDir)).sort();
|
|
88
|
+
for (const name of names){
|
|
89
|
+
const uploadPath = path__default.default.join(uploadsDir, name);
|
|
90
|
+
if (!(await fs__default.default.stat(uploadPath)).isFile()) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
metadata.set(name, await _class_private_field_loose_base(this, _readAssetMetadata)[_readAssetMetadata](name));
|
|
95
|
+
} catch (error) {
|
|
96
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
97
|
+
throw new providers.ProviderValidationError(`Asset metadata preflight failed for "${name}": ${reason}. The destination was not modified; re-export and try again.`, {
|
|
98
|
+
error
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
_class_private_field_loose_base(this, _assetMetadata)[_assetMetadata] = metadata;
|
|
103
|
+
}
|
|
77
104
|
createEntitiesReadStream() {
|
|
78
105
|
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating entities read stream');
|
|
79
106
|
return _class_private_field_loose_base(this, _streamJsonlDirectory)[_streamJsonlDirectory]('entities');
|
|
@@ -138,6 +165,10 @@ class LocalDirectorySourceProvider {
|
|
|
138
165
|
writable: true,
|
|
139
166
|
value: void 0
|
|
140
167
|
});
|
|
168
|
+
Object.defineProperty(this, _assetMetadata, {
|
|
169
|
+
writable: true,
|
|
170
|
+
value: void 0
|
|
171
|
+
});
|
|
141
172
|
Object.defineProperty(this, _diagnostics, {
|
|
142
173
|
writable: true,
|
|
143
174
|
value: void 0
|
|
@@ -184,16 +215,18 @@ async function pipeAssetsToStream(outStream, uploadsDir) {
|
|
|
184
215
|
const absUpload = path__default.default.join(uploadsDir, name);
|
|
185
216
|
const stat = await fs__default.default.stat(absUpload);
|
|
186
217
|
if (stat.isFile()) {
|
|
187
|
-
let metadata;
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
218
|
+
let metadata = _class_private_field_loose_base(this, _assetMetadata)[_assetMetadata]?.get(name);
|
|
219
|
+
if (!metadata) {
|
|
220
|
+
try {
|
|
221
|
+
metadata = await _class_private_field_loose_base(this, _readAssetMetadata)[_readAssetMetadata](name);
|
|
222
|
+
} catch (error) {
|
|
223
|
+
outStream.destroy(new providers.ProviderTransferError(`Failed to read metadata for ${name}`, {
|
|
224
|
+
details: {
|
|
225
|
+
error
|
|
226
|
+
}
|
|
227
|
+
}));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
197
230
|
}
|
|
198
231
|
const normalizedPath = utils.unknownPathToPosix(path__default.default.posix.join('assets', 'uploads', name));
|
|
199
232
|
const asset = {
|
|
@@ -212,7 +245,7 @@ async function pipeAssetsToStream(outStream, uploadsDir) {
|
|
|
212
245
|
}
|
|
213
246
|
async function readAssetMetadata(filename) {
|
|
214
247
|
const metadataPath = _class_private_field_loose_base(this, _safePath)[_safePath]('assets', 'metadata', `${filename}.json`);
|
|
215
|
-
return fs__default.default.readJson(metadataPath);
|
|
248
|
+
return utils.validateAssetMetadata(await fs__default.default.readJson(metadataPath), filename);
|
|
216
249
|
}
|
|
217
250
|
async function listJsonlFiles(posixSubdir) {
|
|
218
251
|
const dirAbs = _class_private_field_loose_base(this, _safePath)[_safePath](...posixSubdir.split('/').filter(Boolean));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/directory/providers/source/index.ts"],"sourcesContent":["import path from 'path';\nimport type { Readable } from 'stream';\nimport { PassThrough } from 'stream';\n\nimport fs from 'fs-extra';\nimport { isEmpty, keyBy } from 'lodash/fp';\nimport { chain } from 'stream-chain';\nimport { parser } from 'stream-json/jsonl/Parser';\nimport type { Struct } from '@strapi/types';\n\nimport type { IAsset, IMetadata, ISourceProvider, ProviderType } from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport * as utils from '../../../utils';\nimport { write } from '../../../utils/writable-async-write';\nimport { ProviderInitializationError, ProviderTransferError } from '../../../errors/providers';\nimport { unknownPathToPosix } from '../../../file/providers/source/utils';\n\nconst METADATA_FILE_PATH = 'metadata.json';\n\nexport interface ILocalDirectorySourceProviderOptions {\n directory: {\n /** Absolute or relative path to the root of an unpacked Strapi data-transfer export */\n path: string;\n };\n}\n\nexport const createLocalDirectorySourceProvider = (\n options: ILocalDirectorySourceProviderOptions\n) => {\n return new LocalDirectorySourceProvider(options);\n};\n\nconst isPathInsideRoot = (root: string, candidate: string): boolean => {\n const relative = path.relative(root, candidate);\n return relative === '' || (!relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));\n};\n\nclass LocalDirectorySourceProvider implements ISourceProvider {\n type: ProviderType = 'source';\n\n name = 'source::local-directory';\n\n options: ILocalDirectorySourceProviderOptions;\n\n #rootResolved: string;\n\n #metadata?: IMetadata;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalDirectorySourceProviderOptions) {\n this.options = options;\n this.#rootResolved = path.resolve(options.directory.path);\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'directory-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Resolve a posix-style relative path under the export root; rejects escapes. */\n #safePath(...posixSegments: string[]): string {\n const joined = path.posix.join(...posixSegments);\n const segments = joined.split(path.posix.sep).filter(Boolean);\n const resolved = path.resolve(this.#rootResolved, ...segments);\n if (!isPathInsideRoot(this.#rootResolved, resolved)) {\n throw new ProviderInitializationError(`Invalid path \"${joined}\" — escapes backup directory`);\n }\n return resolved;\n }\n\n async bootstrap(diagnostics: IDiagnosticReporter) {\n this.#diagnostics = diagnostics;\n const root = this.#rootResolved;\n\n try {\n const stat = await fs.stat(root);\n if (!stat.isDirectory()) {\n throw new ProviderInitializationError(`Path '${root}' is not a directory.`);\n }\n await this.#loadMetadata();\n } catch (e) {\n if (e instanceof ProviderInitializationError) {\n throw e;\n }\n throw new ProviderInitializationError(\n `Directory '${root}' is not a valid Strapi data export.`\n );\n }\n\n if (!this.#metadata) {\n throw new ProviderInitializationError('Could not load metadata from Strapi data export.');\n }\n }\n\n async #loadMetadata() {\n const metadataPath = this.#safePath(METADATA_FILE_PATH);\n if (!(await fs.pathExists(metadataPath))) {\n throw new ProviderInitializationError(\n `Missing ${METADATA_FILE_PATH} in export directory '${this.#rootResolved}'.`\n );\n }\n this.#metadata = await fs.readJson(metadataPath);\n }\n\n async getMetadata() {\n this.#reportInfo('getting metadata');\n if (!this.#metadata) {\n await this.#loadMetadata();\n }\n return this.#metadata ?? null;\n }\n\n async getSchemas() {\n this.#reportInfo('getting schemas');\n const schemaCollection = await utils.stream.collect<Struct.Schema>(\n this.createSchemasReadStream()\n );\n\n if (isEmpty(schemaCollection)) {\n throw new ProviderInitializationError('Could not load schemas from Strapi data export.');\n }\n\n const schemas = keyBy('uid', schemaCollection);\n return utils.schema.schemasToValidJSON(schemas);\n }\n\n createEntitiesReadStream(): Readable {\n this.#reportInfo('creating entities read stream');\n return this.#streamJsonlDirectory('entities');\n }\n\n createSchemasReadStream(): Readable {\n this.#reportInfo('creating schemas read stream');\n return this.#streamJsonlDirectory('schemas');\n }\n\n createLinksReadStream(): Readable {\n this.#reportInfo('creating links read stream');\n return this.#streamJsonlDirectory('links');\n }\n\n createConfigurationReadStream(): Readable {\n this.#reportInfo('creating configuration read stream');\n return this.#streamJsonlDirectory('configuration');\n }\n\n createAssetsReadStream(): Readable {\n const outStream = new PassThrough({ objectMode: true });\n const uploadsDir = this.#safePath('assets', 'uploads');\n this.#reportInfo('creating assets read stream');\n\n this.#pipeAssetsToStream(outStream, uploadsDir).catch((e: unknown) => {\n outStream.destroy(\n e instanceof Error ? e : new ProviderTransferError(String(e), { details: { error: e } })\n );\n });\n\n return outStream;\n }\n\n async #pipeAssetsToStream(outStream: PassThrough, uploadsDir: string): Promise<void> {\n if (!(await fs.pathExists(uploadsDir))) {\n outStream.end();\n return;\n }\n\n const names = (await fs.readdir(uploadsDir)).sort();\n for (const name of names) {\n const absUpload = path.join(uploadsDir, name);\n const stat = await fs.stat(absUpload);\n if (stat.isFile()) {\n let metadata: IAsset['metadata'];\n try {\n metadata = await this.#readAssetMetadata(name);\n } catch (error) {\n outStream.destroy(\n new ProviderTransferError(`Failed to read metadata for ${name}`, {\n details: { error },\n })\n );\n return;\n }\n\n const normalizedPath = unknownPathToPosix(path.posix.join('assets', 'uploads', name));\n const asset: IAsset = {\n metadata,\n filename: name,\n filepath: normalizedPath,\n stats: { size: stat.size },\n stream: fs.createReadStream(absUpload),\n };\n await write(outStream, asset);\n }\n }\n outStream.end();\n }\n\n async #readAssetMetadata(filename: string): Promise<IAsset['metadata']> {\n const metadataPath = this.#safePath('assets', 'metadata', `${filename}.json`);\n return fs.readJson(metadataPath);\n }\n\n async #listJsonlFiles(posixSubdir: string): Promise<string[]> {\n const dirAbs = this.#safePath(...posixSubdir.split('/').filter(Boolean));\n if (!(await fs.pathExists(dirAbs))) {\n return [];\n }\n const names = await fs.readdir(dirAbs);\n return names\n .filter((n) => n.endsWith('.jsonl'))\n .sort()\n .map((n) => path.join(dirAbs, n));\n }\n\n #streamJsonlDirectory(posixSubdir: string): Readable {\n const outStream = new PassThrough({ objectMode: true });\n this.#reportInfo(`streaming jsonl from ${posixSubdir}`);\n\n this.#pipeJsonlDirectoryToStream(outStream, posixSubdir).catch((e: unknown) => {\n outStream.destroy(\n e instanceof Error ? e : new ProviderTransferError(String(e), { details: { error: e } })\n );\n });\n\n return outStream;\n }\n\n async #pipeJsonlDirectoryToStream(outStream: PassThrough, posixSubdir: string): Promise<void> {\n const files = await this.#listJsonlFiles(posixSubdir);\n for (const absPath of files) {\n const transforms = [\n parser({\n checkErrors: true,\n }),\n (line: { key: string; value: object }) => line.value,\n ];\n\n const stream = fs.createReadStream(absPath).pipe(chain(transforms));\n\n try {\n for await (const chunk of stream) {\n await write(outStream, chunk);\n }\n } catch (e: unknown) {\n outStream.destroy(\n new ProviderTransferError(`Error parsing JSONL in ${absPath}: ${(e as Error).message}`, {\n details: {\n error: e,\n },\n })\n );\n return;\n }\n }\n outStream.end();\n }\n}\n"],"names":["METADATA_FILE_PATH","createLocalDirectorySourceProvider","options","LocalDirectorySourceProvider","isPathInsideRoot","root","candidate","relative","path","startsWith","sep","isAbsolute","bootstrap","diagnostics","stat","fs","isDirectory","ProviderInitializationError","e","getMetadata","getSchemas","schemaCollection","utils","createSchemasReadStream","isEmpty","schemas","keyBy","createEntitiesReadStream","createLinksReadStream","createConfigurationReadStream","createAssetsReadStream","outStream","PassThrough","objectMode","uploadsDir","catch","destroy","Error","ProviderTransferError","String","details","error","type","name","resolve","directory","message","report","createdAt","Date","origin","kind","posixSegments","joined","posix","join","segments","split","filter","Boolean","resolved","metadataPath","pathExists","readJson","end","names","readdir","sort","absUpload","isFile","metadata","normalizedPath","unknownPathToPosix","asset","filename","filepath","stats","size","stream","createReadStream","write","posixSubdir","dirAbs","n","endsWith","map","files","absPath","transforms","parser","checkErrors","line","value","pipe","chain","chunk"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/directory/providers/source/index.ts"],"sourcesContent":["import path from 'path';\nimport type { Readable } from 'stream';\nimport { PassThrough } from 'stream';\n\nimport fs from 'fs-extra';\nimport { isEmpty, keyBy } from 'lodash/fp';\nimport { chain } from 'stream-chain';\nimport { parser } from 'stream-json/jsonl/Parser';\nimport type { Struct } from '@strapi/types';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ProviderType,\n TransferStage,\n} from '../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport * as utils from '../../../utils';\nimport { write } from '../../../utils/writable-async-write';\nimport {\n ProviderInitializationError,\n ProviderTransferError,\n ProviderValidationError,\n} from '../../../errors/providers';\nimport { unknownPathToPosix, validateAssetMetadata } from '../../../file/providers/source/utils';\n\nconst METADATA_FILE_PATH = 'metadata.json';\n\nexport interface ILocalDirectorySourceProviderOptions {\n directory: {\n /** Absolute or relative path to the root of an unpacked Strapi data-transfer export */\n path: string;\n };\n}\n\nexport const createLocalDirectorySourceProvider = (\n options: ILocalDirectorySourceProviderOptions\n) => {\n return new LocalDirectorySourceProvider(options);\n};\n\nconst isPathInsideRoot = (root: string, candidate: string): boolean => {\n const relative = path.relative(root, candidate);\n return relative === '' || (!relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));\n};\n\nclass LocalDirectorySourceProvider implements ISourceProvider {\n type: ProviderType = 'source';\n\n name = 'source::local-directory';\n\n options: ILocalDirectorySourceProviderOptions;\n\n #rootResolved: string;\n\n #metadata?: IMetadata;\n\n #assetMetadata?: Map<string, IAsset['metadata']>;\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalDirectorySourceProviderOptions) {\n this.options = options;\n this.#rootResolved = path.resolve(options.directory.path);\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'directory-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Resolve a posix-style relative path under the export root; rejects escapes. */\n #safePath(...posixSegments: string[]): string {\n const joined = path.posix.join(...posixSegments);\n const segments = joined.split(path.posix.sep).filter(Boolean);\n const resolved = path.resolve(this.#rootResolved, ...segments);\n if (!isPathInsideRoot(this.#rootResolved, resolved)) {\n throw new ProviderInitializationError(`Invalid path \"${joined}\" — escapes backup directory`);\n }\n return resolved;\n }\n\n async bootstrap(diagnostics: IDiagnosticReporter) {\n this.#diagnostics = diagnostics;\n const root = this.#rootResolved;\n\n try {\n const stat = await fs.stat(root);\n if (!stat.isDirectory()) {\n throw new ProviderInitializationError(`Path '${root}' is not a directory.`);\n }\n await this.#loadMetadata();\n } catch (e) {\n if (e instanceof ProviderInitializationError) {\n throw e;\n }\n throw new ProviderInitializationError(\n `Directory '${root}' is not a valid Strapi data export.`\n );\n }\n\n if (!this.#metadata) {\n throw new ProviderInitializationError('Could not load metadata from Strapi data export.');\n }\n }\n\n async #loadMetadata() {\n const metadataPath = this.#safePath(METADATA_FILE_PATH);\n if (!(await fs.pathExists(metadataPath))) {\n throw new ProviderInitializationError(\n `Missing ${METADATA_FILE_PATH} in export directory '${this.#rootResolved}'.`\n );\n }\n this.#metadata = await fs.readJson(metadataPath);\n }\n\n async getMetadata() {\n this.#reportInfo('getting metadata');\n if (!this.#metadata) {\n await this.#loadMetadata();\n }\n return this.#metadata ?? null;\n }\n\n async getSchemas() {\n this.#reportInfo('getting schemas');\n const schemaCollection = await utils.stream.collect<Struct.Schema>(\n this.createSchemasReadStream()\n );\n\n if (isEmpty(schemaCollection)) {\n throw new ProviderInitializationError('Could not load schemas from Strapi data export.');\n }\n\n const schemas = keyBy('uid', schemaCollection);\n return utils.schema.schemasToValidJSON(schemas);\n }\n\n async validateStage(stage: TransferStage) {\n if (stage !== 'assets') {\n return;\n }\n\n const uploadsDir = this.#safePath('assets', 'uploads');\n if (!(await fs.pathExists(uploadsDir))) {\n this.#assetMetadata = new Map();\n return;\n }\n\n const metadata = new Map<string, IAsset['metadata']>();\n const names = (await fs.readdir(uploadsDir)).sort();\n for (const name of names) {\n const uploadPath = path.join(uploadsDir, name);\n if (!(await fs.stat(uploadPath)).isFile()) {\n continue;\n }\n\n try {\n metadata.set(name, await this.#readAssetMetadata(name));\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new ProviderValidationError(\n `Asset metadata preflight failed for \"${name}\": ${reason}. The destination was not modified; re-export and try again.`,\n { error }\n );\n }\n }\n\n this.#assetMetadata = metadata;\n }\n\n createEntitiesReadStream(): Readable {\n this.#reportInfo('creating entities read stream');\n return this.#streamJsonlDirectory('entities');\n }\n\n createSchemasReadStream(): Readable {\n this.#reportInfo('creating schemas read stream');\n return this.#streamJsonlDirectory('schemas');\n }\n\n createLinksReadStream(): Readable {\n this.#reportInfo('creating links read stream');\n return this.#streamJsonlDirectory('links');\n }\n\n createConfigurationReadStream(): Readable {\n this.#reportInfo('creating configuration read stream');\n return this.#streamJsonlDirectory('configuration');\n }\n\n createAssetsReadStream(): Readable {\n const outStream = new PassThrough({ objectMode: true });\n const uploadsDir = this.#safePath('assets', 'uploads');\n this.#reportInfo('creating assets read stream');\n\n this.#pipeAssetsToStream(outStream, uploadsDir).catch((e: unknown) => {\n outStream.destroy(\n e instanceof Error ? e : new ProviderTransferError(String(e), { details: { error: e } })\n );\n });\n\n return outStream;\n }\n\n async #pipeAssetsToStream(outStream: PassThrough, uploadsDir: string): Promise<void> {\n if (!(await fs.pathExists(uploadsDir))) {\n outStream.end();\n return;\n }\n\n const names = (await fs.readdir(uploadsDir)).sort();\n for (const name of names) {\n const absUpload = path.join(uploadsDir, name);\n const stat = await fs.stat(absUpload);\n if (stat.isFile()) {\n let metadata = this.#assetMetadata?.get(name);\n if (!metadata) {\n try {\n metadata = await this.#readAssetMetadata(name);\n } catch (error) {\n outStream.destroy(\n new ProviderTransferError(`Failed to read metadata for ${name}`, {\n details: { error },\n })\n );\n return;\n }\n }\n\n const normalizedPath = unknownPathToPosix(path.posix.join('assets', 'uploads', name));\n const asset: IAsset = {\n metadata,\n filename: name,\n filepath: normalizedPath,\n stats: { size: stat.size },\n stream: fs.createReadStream(absUpload),\n };\n await write(outStream, asset);\n }\n }\n outStream.end();\n }\n\n async #readAssetMetadata(filename: string): Promise<IAsset['metadata']> {\n const metadataPath = this.#safePath('assets', 'metadata', `${filename}.json`);\n return validateAssetMetadata(await fs.readJson(metadataPath), filename);\n }\n\n async #listJsonlFiles(posixSubdir: string): Promise<string[]> {\n const dirAbs = this.#safePath(...posixSubdir.split('/').filter(Boolean));\n if (!(await fs.pathExists(dirAbs))) {\n return [];\n }\n const names = await fs.readdir(dirAbs);\n return names\n .filter((n) => n.endsWith('.jsonl'))\n .sort()\n .map((n) => path.join(dirAbs, n));\n }\n\n #streamJsonlDirectory(posixSubdir: string): Readable {\n const outStream = new PassThrough({ objectMode: true });\n this.#reportInfo(`streaming jsonl from ${posixSubdir}`);\n\n this.#pipeJsonlDirectoryToStream(outStream, posixSubdir).catch((e: unknown) => {\n outStream.destroy(\n e instanceof Error ? e : new ProviderTransferError(String(e), { details: { error: e } })\n );\n });\n\n return outStream;\n }\n\n async #pipeJsonlDirectoryToStream(outStream: PassThrough, posixSubdir: string): Promise<void> {\n const files = await this.#listJsonlFiles(posixSubdir);\n for (const absPath of files) {\n const transforms = [\n parser({\n checkErrors: true,\n }),\n (line: { key: string; value: object }) => line.value,\n ];\n\n const stream = fs.createReadStream(absPath).pipe(chain(transforms));\n\n try {\n for await (const chunk of stream) {\n await write(outStream, chunk);\n }\n } catch (e: unknown) {\n outStream.destroy(\n new ProviderTransferError(`Error parsing JSONL in ${absPath}: ${(e as Error).message}`, {\n details: {\n error: e,\n },\n })\n );\n return;\n }\n }\n outStream.end();\n }\n}\n"],"names":["METADATA_FILE_PATH","createLocalDirectorySourceProvider","options","LocalDirectorySourceProvider","isPathInsideRoot","root","candidate","relative","path","startsWith","sep","isAbsolute","bootstrap","diagnostics","stat","fs","isDirectory","ProviderInitializationError","e","getMetadata","getSchemas","schemaCollection","utils","createSchemasReadStream","isEmpty","schemas","keyBy","validateStage","stage","uploadsDir","pathExists","Map","metadata","names","readdir","sort","name","uploadPath","join","isFile","set","error","reason","Error","message","String","ProviderValidationError","createEntitiesReadStream","createLinksReadStream","createConfigurationReadStream","createAssetsReadStream","outStream","PassThrough","objectMode","catch","destroy","ProviderTransferError","details","type","resolve","directory","report","createdAt","Date","origin","kind","posixSegments","joined","posix","segments","split","filter","Boolean","resolved","metadataPath","readJson","end","absUpload","get","normalizedPath","unknownPathToPosix","asset","filename","filepath","stats","size","stream","createReadStream","write","validateAssetMetadata","posixSubdir","dirAbs","n","endsWith","map","files","absPath","transforms","parser","checkErrors","line","value","pipe","chain","chunk"],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ import { write } from '../../../utils/writable-async-write.mjs';
|
|
|
9
9
|
import { collect } from '../../../utils/stream.mjs';
|
|
10
10
|
import { schemasToValidJSON } from '../../../utils/schema.mjs';
|
|
11
11
|
import 'events';
|
|
12
|
-
import { ProviderInitializationError, ProviderTransferError } from '../../../errors/providers.mjs';
|
|
13
|
-
import { unknownPathToPosix } from '../../../file/providers/source/utils.mjs';
|
|
12
|
+
import { ProviderInitializationError, ProviderValidationError, ProviderTransferError } from '../../../errors/providers.mjs';
|
|
13
|
+
import { unknownPathToPosix, validateAssetMetadata } from '../../../file/providers/source/utils.mjs';
|
|
14
14
|
|
|
15
15
|
function _class_private_field_loose_base(receiver, privateKey) {
|
|
16
16
|
if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
|
|
@@ -30,7 +30,7 @@ const isPathInsideRoot = (root, candidate)=>{
|
|
|
30
30
|
const relative = path.relative(root, candidate);
|
|
31
31
|
return relative === '' || !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
|
|
32
32
|
};
|
|
33
|
-
var _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _metadata = /*#__PURE__*/ _class_private_field_loose_key("_metadata"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), /** Resolve a posix-style relative path under the export root; rejects escapes. */ _safePath = /*#__PURE__*/ _class_private_field_loose_key("_safePath"), _loadMetadata = /*#__PURE__*/ _class_private_field_loose_key("_loadMetadata"), _pipeAssetsToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeAssetsToStream"), _readAssetMetadata = /*#__PURE__*/ _class_private_field_loose_key("_readAssetMetadata"), _listJsonlFiles = /*#__PURE__*/ _class_private_field_loose_key("_listJsonlFiles"), _streamJsonlDirectory = /*#__PURE__*/ _class_private_field_loose_key("_streamJsonlDirectory"), _pipeJsonlDirectoryToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeJsonlDirectoryToStream");
|
|
33
|
+
var _rootResolved = /*#__PURE__*/ _class_private_field_loose_key("_rootResolved"), _metadata = /*#__PURE__*/ _class_private_field_loose_key("_metadata"), _assetMetadata = /*#__PURE__*/ _class_private_field_loose_key("_assetMetadata"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), /** Resolve a posix-style relative path under the export root; rejects escapes. */ _safePath = /*#__PURE__*/ _class_private_field_loose_key("_safePath"), _loadMetadata = /*#__PURE__*/ _class_private_field_loose_key("_loadMetadata"), _pipeAssetsToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeAssetsToStream"), _readAssetMetadata = /*#__PURE__*/ _class_private_field_loose_key("_readAssetMetadata"), _listJsonlFiles = /*#__PURE__*/ _class_private_field_loose_key("_listJsonlFiles"), _streamJsonlDirectory = /*#__PURE__*/ _class_private_field_loose_key("_streamJsonlDirectory"), _pipeJsonlDirectoryToStream = /*#__PURE__*/ _class_private_field_loose_key("_pipeJsonlDirectoryToStream");
|
|
34
34
|
class LocalDirectorySourceProvider {
|
|
35
35
|
async bootstrap(diagnostics) {
|
|
36
36
|
_class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
|
|
@@ -67,6 +67,33 @@ class LocalDirectorySourceProvider {
|
|
|
67
67
|
const schemas = keyBy('uid', schemaCollection);
|
|
68
68
|
return schemasToValidJSON(schemas);
|
|
69
69
|
}
|
|
70
|
+
async validateStage(stage) {
|
|
71
|
+
if (stage !== 'assets') {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const uploadsDir = _class_private_field_loose_base(this, _safePath)[_safePath]('assets', 'uploads');
|
|
75
|
+
if (!await fs__default.pathExists(uploadsDir)) {
|
|
76
|
+
_class_private_field_loose_base(this, _assetMetadata)[_assetMetadata] = new Map();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const metadata = new Map();
|
|
80
|
+
const names = (await fs__default.readdir(uploadsDir)).sort();
|
|
81
|
+
for (const name of names){
|
|
82
|
+
const uploadPath = path.join(uploadsDir, name);
|
|
83
|
+
if (!(await fs__default.stat(uploadPath)).isFile()) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
metadata.set(name, await _class_private_field_loose_base(this, _readAssetMetadata)[_readAssetMetadata](name));
|
|
88
|
+
} catch (error) {
|
|
89
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
90
|
+
throw new ProviderValidationError(`Asset metadata preflight failed for "${name}": ${reason}. The destination was not modified; re-export and try again.`, {
|
|
91
|
+
error
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
_class_private_field_loose_base(this, _assetMetadata)[_assetMetadata] = metadata;
|
|
96
|
+
}
|
|
70
97
|
createEntitiesReadStream() {
|
|
71
98
|
_class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating entities read stream');
|
|
72
99
|
return _class_private_field_loose_base(this, _streamJsonlDirectory)[_streamJsonlDirectory]('entities');
|
|
@@ -131,6 +158,10 @@ class LocalDirectorySourceProvider {
|
|
|
131
158
|
writable: true,
|
|
132
159
|
value: void 0
|
|
133
160
|
});
|
|
161
|
+
Object.defineProperty(this, _assetMetadata, {
|
|
162
|
+
writable: true,
|
|
163
|
+
value: void 0
|
|
164
|
+
});
|
|
134
165
|
Object.defineProperty(this, _diagnostics, {
|
|
135
166
|
writable: true,
|
|
136
167
|
value: void 0
|
|
@@ -177,16 +208,18 @@ async function pipeAssetsToStream(outStream, uploadsDir) {
|
|
|
177
208
|
const absUpload = path.join(uploadsDir, name);
|
|
178
209
|
const stat = await fs__default.stat(absUpload);
|
|
179
210
|
if (stat.isFile()) {
|
|
180
|
-
let metadata;
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
211
|
+
let metadata = _class_private_field_loose_base(this, _assetMetadata)[_assetMetadata]?.get(name);
|
|
212
|
+
if (!metadata) {
|
|
213
|
+
try {
|
|
214
|
+
metadata = await _class_private_field_loose_base(this, _readAssetMetadata)[_readAssetMetadata](name);
|
|
215
|
+
} catch (error) {
|
|
216
|
+
outStream.destroy(new ProviderTransferError(`Failed to read metadata for ${name}`, {
|
|
217
|
+
details: {
|
|
218
|
+
error
|
|
219
|
+
}
|
|
220
|
+
}));
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
190
223
|
}
|
|
191
224
|
const normalizedPath = unknownPathToPosix(path.posix.join('assets', 'uploads', name));
|
|
192
225
|
const asset = {
|
|
@@ -205,7 +238,7 @@ async function pipeAssetsToStream(outStream, uploadsDir) {
|
|
|
205
238
|
}
|
|
206
239
|
async function readAssetMetadata(filename) {
|
|
207
240
|
const metadataPath = _class_private_field_loose_base(this, _safePath)[_safePath]('assets', 'metadata', `${filename}.json`);
|
|
208
|
-
return fs__default.readJson(metadataPath);
|
|
241
|
+
return validateAssetMetadata(await fs__default.readJson(metadataPath), filename);
|
|
209
242
|
}
|
|
210
243
|
async function listJsonlFiles(posixSubdir) {
|
|
211
244
|
const dirAbs = _class_private_field_loose_base(this, _safePath)[_safePath](...posixSubdir.split('/').filter(Boolean));
|