From 65fcd0d9211c406832a81a8d7e205989f1a55d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Fri, 22 Dec 2023 11:28:20 +0100 Subject: [PATCH 1/2] Move the stream-compression package from wp-playground to php-wasm Stream Compression introduced in #851 has no dependencies on WordPress and can be used in any JavaScript project. It also makes sense as a dependency for some `@php-wasm` packages. This commit, therefore, moves it from the `wp-playground` to the `php-wasm` npm namespace, making it reusable across the entire project. In addition, this adds a new `iterateFiles` function to the `@php-wasm/universal` package, which allows iterating over the files in the PHP filesystem. It uses the `stream-compression` package, which was some of the motivation for the move. ## Testing instructions Since the package isn't used anywhere yet, only confirm if the CI checks pass. --- .eslintrc.json | 6 ++ package-lock.json | 17 +++-- packages/php-wasm/node/project.json | 2 +- .../stream-compression/.eslintrc.json | 0 .../php-wasm/stream-compression/README.md | 11 +++ .../stream-compression/package.json | 4 +- .../stream-compression/project.json | 14 ++-- .../stream-compression/src/index.ts | 2 +- .../src/test/append-bytes.spec.ts | 0 .../src/test/decode-zip.spec.ts | 0 .../src/test/encode-zip.spec.ts | 0 .../src/test/fixtures/hello-dolly.zip | Bin .../src/test/prepend-bytes.spec.ts | 0 .../src/test/skip-first-bytes.spec.ts | 0 .../src/test/skip-last-bytes.spec.ts | 0 .../src/test/vitest-setup-file.ts | 0 .../src/utils/append-bytes.ts | 0 .../src/utils/collect-bytes.ts | 0 .../src/utils/collect-file.ts | 0 .../src/utils/collect-string.ts | 0 .../src/utils/concat-bytes.ts | 0 .../src/utils/concat-string.ts | 0 .../src/utils/concat-uint8-array.ts | 0 .../src/utils/filter-stream.ts | 0 .../src/utils/iterable-stream-polyfill.ts | 0 .../src/utils/iterator-to-stream.ts | 0 .../src/utils/limit-bytes.ts | 0 .../src/utils/prepend-bytes.ts | 0 .../src/utils/skip-first-bytes.ts | 0 .../src/utils/skip-last-bytes.ts | 0 .../src/utils/streamed-file.ts | 58 ++++++++++++++ .../src/zip/decode-remote-zip.ts | 0 .../stream-compression/src/zip/decode-zip.ts | 0 .../stream-compression/src/zip/encode-zip.ts | 0 .../stream-compression/src/zip/index.ts | 0 .../stream-compression/src/zip/types.ts | 0 .../stream-compression/tsconfig.json | 0 .../stream-compression/tsconfig.lib.json | 6 +- .../stream-compression/tsconfig.spec.json | 0 .../stream-compression/vite.config.ts | 4 +- packages/php-wasm/universal/src/lib/index.ts | 4 + .../universal/src/lib/iterate-files.ts | 71 ++++++++++++++++++ .../src/lib/write-files-stream-to-php.ts} | 4 +- packages/php-wasm/util/project.json | 2 +- packages/php-wasm/util/tsconfig.lib.json | 2 +- packages/php-wasm/web/project.json | 2 +- .../playground/stream-compression/README.md | 11 --- tsconfig.base.json | 6 +- 48 files changed, 188 insertions(+), 38 deletions(-) rename packages/{playground => php-wasm}/stream-compression/.eslintrc.json (100%) create mode 100644 packages/php-wasm/stream-compression/README.md rename packages/{playground => php-wasm}/stream-compression/package.json (84%) rename packages/{playground => php-wasm}/stream-compression/project.json (56%) rename packages/{playground => php-wasm}/stream-compression/src/index.ts (80%) rename packages/{playground => php-wasm}/stream-compression/src/test/append-bytes.spec.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/test/decode-zip.spec.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/test/encode-zip.spec.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/test/fixtures/hello-dolly.zip (100%) rename packages/{playground => php-wasm}/stream-compression/src/test/prepend-bytes.spec.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/test/skip-first-bytes.spec.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/test/skip-last-bytes.spec.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/test/vitest-setup-file.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/append-bytes.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/collect-bytes.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/collect-file.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/collect-string.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/concat-bytes.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/concat-string.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/concat-uint8-array.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/filter-stream.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/iterable-stream-polyfill.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/iterator-to-stream.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/limit-bytes.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/prepend-bytes.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/skip-first-bytes.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/utils/skip-last-bytes.ts (100%) create mode 100644 packages/php-wasm/stream-compression/src/utils/streamed-file.ts rename packages/{playground => php-wasm}/stream-compression/src/zip/decode-remote-zip.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/zip/decode-zip.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/zip/encode-zip.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/zip/index.ts (100%) rename packages/{playground => php-wasm}/stream-compression/src/zip/types.ts (100%) rename packages/{playground => php-wasm}/stream-compression/tsconfig.json (100%) rename packages/{playground => php-wasm}/stream-compression/tsconfig.lib.json (67%) rename packages/{playground => php-wasm}/stream-compression/tsconfig.spec.json (100%) rename packages/{playground => php-wasm}/stream-compression/vite.config.ts (91%) create mode 100644 packages/php-wasm/universal/src/lib/iterate-files.ts rename packages/{playground/stream-compression/src/utils/stream-write-to-php.ts => php-wasm/universal/src/lib/write-files-stream-to-php.ts} (78%) delete mode 100644 packages/playground/stream-compression/README.md diff --git a/.eslintrc.json b/.eslintrc.json index 0c4063310ad..c95f836c1d1 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,6 +15,12 @@ { "sourceTag": "*", "notDependOnLibsWithTags": ["scope:web-client"] + }, + { + "sourceTag": "scope:independent-from-php-binaries", + "notDependOnLibsWithTags": [ + "scope:php-binaries" + ] } ] } diff --git a/package-lock.json b/package-lock.json index 2c94d97401f..83bab7b5293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14004,6 +14004,10 @@ "resolved": "packages/php-wasm/scopes", "link": true }, + "node_modules/@php-wasm/stream-compression": { + "resolved": "packages/php-wasm/stream-compression", + "link": true + }, "node_modules/@php-wasm/universal": { "resolved": "packages/php-wasm/universal", "link": true @@ -17841,10 +17845,6 @@ "resolved": "packages/playground/storage", "link": true }, - "node_modules/@wp-playground/stream-compression": { - "resolved": "packages/playground/stream-compression", - "link": true - }, "node_modules/@wp-playground/sync": { "resolved": "packages/playground/sync", "link": true @@ -44965,6 +44965,10 @@ "npm": ">=8.11.0" } }, + "packages/php-wasm/stream-compression": { + "version": "0.0.1", + "license": "GPL-2.0-or-later" + }, "packages/php-wasm/universal": { "name": "@php-wasm/universal", "version": "0.5.2", @@ -45043,6 +45047,7 @@ "packages/playground/stream-compression": { "name": "@wp-playground/stream-compression", "version": "0.0.1", + "extraneous": true, "license": "GPL-2.0-or-later" }, "packages/playground/sync": { @@ -45050,7 +45055,9 @@ "version": "0.0.1", "license": "GPL-2.0-or-later" }, - "packages/playground/website": {}, + "packages/playground/website": { + "version": "0.0.1" + }, "packages/playground/wordpress": { "name": "@wp-playground/wordpress", "version": "0.0.1", diff --git a/packages/php-wasm/node/project.json b/packages/php-wasm/node/project.json index 0f2cc187a6a..5aa9daff708 100644 --- a/packages/php-wasm/node/project.json +++ b/packages/php-wasm/node/project.json @@ -161,5 +161,5 @@ } } }, - "tags": [] + "tags": ["scope:php-binaries"] } diff --git a/packages/playground/stream-compression/.eslintrc.json b/packages/php-wasm/stream-compression/.eslintrc.json similarity index 100% rename from packages/playground/stream-compression/.eslintrc.json rename to packages/php-wasm/stream-compression/.eslintrc.json diff --git a/packages/php-wasm/stream-compression/README.md b/packages/php-wasm/stream-compression/README.md new file mode 100644 index 00000000000..b12e58376d2 --- /dev/null +++ b/packages/php-wasm/stream-compression/README.md @@ -0,0 +1,11 @@ +# php-wasm-stream-compression + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build php-wasm-stream-compression` to build the library. + +## Running unit tests + +Run `nx test php-wasm-stream-compression` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/packages/playground/stream-compression/package.json b/packages/php-wasm/stream-compression/package.json similarity index 84% rename from packages/playground/stream-compression/package.json rename to packages/php-wasm/stream-compression/package.json index 921c9d7c6e7..4e1d4d6c408 100644 --- a/packages/playground/stream-compression/package.json +++ b/packages/php-wasm/stream-compression/package.json @@ -1,5 +1,5 @@ { - "name": "@wp-playground/stream-compression", + "name": "@php-wasm/stream-compression", "version": "0.0.1", "description": "Stream-based compression bindings.", "repository": { @@ -24,7 +24,7 @@ }, "publishConfig": { "access": "public", - "directory": "../../../dist/packages/playground/stream-compression" + "directory": "../../../dist/packages/php-wasm/stream-compression" }, "license": "GPL-2.0-or-later", "type": "module", diff --git a/packages/playground/stream-compression/project.json b/packages/php-wasm/stream-compression/project.json similarity index 56% rename from packages/playground/stream-compression/project.json rename to packages/php-wasm/stream-compression/project.json index 80df12c7435..57e23336b64 100644 --- a/packages/playground/stream-compression/project.json +++ b/packages/php-wasm/stream-compression/project.json @@ -1,14 +1,14 @@ { - "name": "playground-stream-compression", + "name": "php-wasm-stream-compression", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "packages/playground/stream-compression/src", + "sourceRoot": "packages/php-wasm/stream-compression/src", "projectType": "library", "targets": { "build": { "executor": "@nx/vite:build", "outputs": ["{options.outputPath}"], "options": { - "outputPath": "dist/packages/playground/stream-compression" + "outputPath": "dist/packages/php-wasm/stream-compression" } }, "test": { @@ -16,7 +16,7 @@ "outputs": ["{options.reportsDirectory}"], "options": { "passWithNoTests": true, - "reportsDirectory": "../../../coverage/packages/playground/stream-compression" + "reportsDirectory": "../../../coverage/packages/php-wasm/stream-compression" } }, "lint": { @@ -24,11 +24,11 @@ "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": [ - "packages/playground/stream-compression/**/*.ts", - "packages/playground/stream-compression/package.json" + "packages/php-wasm/stream-compression/**/*.ts", + "packages/php-wasm/stream-compression/package.json" ] } } }, - "tags": [] + "tags": ["scope:independent-from-php-binaries"] } diff --git a/packages/playground/stream-compression/src/index.ts b/packages/php-wasm/stream-compression/src/index.ts similarity index 80% rename from packages/playground/stream-compression/src/index.ts rename to packages/php-wasm/stream-compression/src/index.ts index 496f2288fa5..085e8508c67 100644 --- a/packages/playground/stream-compression/src/index.ts +++ b/packages/php-wasm/stream-compression/src/index.ts @@ -3,5 +3,5 @@ import '@php-wasm/node-polyfills'; export { collectBytes } from './utils/collect-bytes'; export { collectFile } from './utils/collect-file'; export { iteratorToStream } from './utils/iterator-to-stream'; -export { streamWriteToPhp } from './utils/stream-write-to-php'; +export { StreamedFile } from './utils/streamed-file'; export { encodeZip, decodeZip, decodeRemoteZip } from './zip'; diff --git a/packages/playground/stream-compression/src/test/append-bytes.spec.ts b/packages/php-wasm/stream-compression/src/test/append-bytes.spec.ts similarity index 100% rename from packages/playground/stream-compression/src/test/append-bytes.spec.ts rename to packages/php-wasm/stream-compression/src/test/append-bytes.spec.ts diff --git a/packages/playground/stream-compression/src/test/decode-zip.spec.ts b/packages/php-wasm/stream-compression/src/test/decode-zip.spec.ts similarity index 100% rename from packages/playground/stream-compression/src/test/decode-zip.spec.ts rename to packages/php-wasm/stream-compression/src/test/decode-zip.spec.ts diff --git a/packages/playground/stream-compression/src/test/encode-zip.spec.ts b/packages/php-wasm/stream-compression/src/test/encode-zip.spec.ts similarity index 100% rename from packages/playground/stream-compression/src/test/encode-zip.spec.ts rename to packages/php-wasm/stream-compression/src/test/encode-zip.spec.ts diff --git a/packages/playground/stream-compression/src/test/fixtures/hello-dolly.zip b/packages/php-wasm/stream-compression/src/test/fixtures/hello-dolly.zip similarity index 100% rename from packages/playground/stream-compression/src/test/fixtures/hello-dolly.zip rename to packages/php-wasm/stream-compression/src/test/fixtures/hello-dolly.zip diff --git a/packages/playground/stream-compression/src/test/prepend-bytes.spec.ts b/packages/php-wasm/stream-compression/src/test/prepend-bytes.spec.ts similarity index 100% rename from packages/playground/stream-compression/src/test/prepend-bytes.spec.ts rename to packages/php-wasm/stream-compression/src/test/prepend-bytes.spec.ts diff --git a/packages/playground/stream-compression/src/test/skip-first-bytes.spec.ts b/packages/php-wasm/stream-compression/src/test/skip-first-bytes.spec.ts similarity index 100% rename from packages/playground/stream-compression/src/test/skip-first-bytes.spec.ts rename to packages/php-wasm/stream-compression/src/test/skip-first-bytes.spec.ts diff --git a/packages/playground/stream-compression/src/test/skip-last-bytes.spec.ts b/packages/php-wasm/stream-compression/src/test/skip-last-bytes.spec.ts similarity index 100% rename from packages/playground/stream-compression/src/test/skip-last-bytes.spec.ts rename to packages/php-wasm/stream-compression/src/test/skip-last-bytes.spec.ts diff --git a/packages/playground/stream-compression/src/test/vitest-setup-file.ts b/packages/php-wasm/stream-compression/src/test/vitest-setup-file.ts similarity index 100% rename from packages/playground/stream-compression/src/test/vitest-setup-file.ts rename to packages/php-wasm/stream-compression/src/test/vitest-setup-file.ts diff --git a/packages/playground/stream-compression/src/utils/append-bytes.ts b/packages/php-wasm/stream-compression/src/utils/append-bytes.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/append-bytes.ts rename to packages/php-wasm/stream-compression/src/utils/append-bytes.ts diff --git a/packages/playground/stream-compression/src/utils/collect-bytes.ts b/packages/php-wasm/stream-compression/src/utils/collect-bytes.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/collect-bytes.ts rename to packages/php-wasm/stream-compression/src/utils/collect-bytes.ts diff --git a/packages/playground/stream-compression/src/utils/collect-file.ts b/packages/php-wasm/stream-compression/src/utils/collect-file.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/collect-file.ts rename to packages/php-wasm/stream-compression/src/utils/collect-file.ts diff --git a/packages/playground/stream-compression/src/utils/collect-string.ts b/packages/php-wasm/stream-compression/src/utils/collect-string.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/collect-string.ts rename to packages/php-wasm/stream-compression/src/utils/collect-string.ts diff --git a/packages/playground/stream-compression/src/utils/concat-bytes.ts b/packages/php-wasm/stream-compression/src/utils/concat-bytes.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/concat-bytes.ts rename to packages/php-wasm/stream-compression/src/utils/concat-bytes.ts diff --git a/packages/playground/stream-compression/src/utils/concat-string.ts b/packages/php-wasm/stream-compression/src/utils/concat-string.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/concat-string.ts rename to packages/php-wasm/stream-compression/src/utils/concat-string.ts diff --git a/packages/playground/stream-compression/src/utils/concat-uint8-array.ts b/packages/php-wasm/stream-compression/src/utils/concat-uint8-array.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/concat-uint8-array.ts rename to packages/php-wasm/stream-compression/src/utils/concat-uint8-array.ts diff --git a/packages/playground/stream-compression/src/utils/filter-stream.ts b/packages/php-wasm/stream-compression/src/utils/filter-stream.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/filter-stream.ts rename to packages/php-wasm/stream-compression/src/utils/filter-stream.ts diff --git a/packages/playground/stream-compression/src/utils/iterable-stream-polyfill.ts b/packages/php-wasm/stream-compression/src/utils/iterable-stream-polyfill.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/iterable-stream-polyfill.ts rename to packages/php-wasm/stream-compression/src/utils/iterable-stream-polyfill.ts diff --git a/packages/playground/stream-compression/src/utils/iterator-to-stream.ts b/packages/php-wasm/stream-compression/src/utils/iterator-to-stream.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/iterator-to-stream.ts rename to packages/php-wasm/stream-compression/src/utils/iterator-to-stream.ts diff --git a/packages/playground/stream-compression/src/utils/limit-bytes.ts b/packages/php-wasm/stream-compression/src/utils/limit-bytes.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/limit-bytes.ts rename to packages/php-wasm/stream-compression/src/utils/limit-bytes.ts diff --git a/packages/playground/stream-compression/src/utils/prepend-bytes.ts b/packages/php-wasm/stream-compression/src/utils/prepend-bytes.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/prepend-bytes.ts rename to packages/php-wasm/stream-compression/src/utils/prepend-bytes.ts diff --git a/packages/playground/stream-compression/src/utils/skip-first-bytes.ts b/packages/php-wasm/stream-compression/src/utils/skip-first-bytes.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/skip-first-bytes.ts rename to packages/php-wasm/stream-compression/src/utils/skip-first-bytes.ts diff --git a/packages/playground/stream-compression/src/utils/skip-last-bytes.ts b/packages/php-wasm/stream-compression/src/utils/skip-last-bytes.ts similarity index 100% rename from packages/playground/stream-compression/src/utils/skip-last-bytes.ts rename to packages/php-wasm/stream-compression/src/utils/skip-last-bytes.ts diff --git a/packages/php-wasm/stream-compression/src/utils/streamed-file.ts b/packages/php-wasm/stream-compression/src/utils/streamed-file.ts new file mode 100644 index 00000000000..a4150e2af43 --- /dev/null +++ b/packages/php-wasm/stream-compression/src/utils/streamed-file.ts @@ -0,0 +1,58 @@ +import { collectBytes } from './collect-bytes'; + +/** + * Represents a file that is streamed and not fully + * loaded into memory. + */ +export class StreamedFile extends File { + /** + * Creates a new StreamedFile instance. + * + * @param readableStream The readable stream containing the file data. + * @param name The name of the file. + * @param type The MIME type of the file. + */ + constructor( + private readableStream: ReadableStream, + name: string, + type?: string + ) { + super([], name, { type }); + } + + /** + * Overrides the slice() method of the File class. + * + * @returns A Blob representing a portion of the file. + */ + override slice(): Blob { + throw new Error('slice() is not possible on a StreamedFile'); + } + + /** + * Returns the readable stream associated with the file. + * + * @returns The readable stream. + */ + override stream() { + return this.readableStream; + } + + /** + * Loads the file data into memory and then returns it as a string. + * + * @returns File data as text. + */ + override async text() { + return new TextDecoder().decode(await this.arrayBuffer()); + } + + /** + * Loads the file data into memory and then returns it as an ArrayBuffer. + * + * @returns File data as an ArrayBuffer. + */ + override async arrayBuffer() { + return await collectBytes(this.stream()); + } +} diff --git a/packages/playground/stream-compression/src/zip/decode-remote-zip.ts b/packages/php-wasm/stream-compression/src/zip/decode-remote-zip.ts similarity index 100% rename from packages/playground/stream-compression/src/zip/decode-remote-zip.ts rename to packages/php-wasm/stream-compression/src/zip/decode-remote-zip.ts diff --git a/packages/playground/stream-compression/src/zip/decode-zip.ts b/packages/php-wasm/stream-compression/src/zip/decode-zip.ts similarity index 100% rename from packages/playground/stream-compression/src/zip/decode-zip.ts rename to packages/php-wasm/stream-compression/src/zip/decode-zip.ts diff --git a/packages/playground/stream-compression/src/zip/encode-zip.ts b/packages/php-wasm/stream-compression/src/zip/encode-zip.ts similarity index 100% rename from packages/playground/stream-compression/src/zip/encode-zip.ts rename to packages/php-wasm/stream-compression/src/zip/encode-zip.ts diff --git a/packages/playground/stream-compression/src/zip/index.ts b/packages/php-wasm/stream-compression/src/zip/index.ts similarity index 100% rename from packages/playground/stream-compression/src/zip/index.ts rename to packages/php-wasm/stream-compression/src/zip/index.ts diff --git a/packages/playground/stream-compression/src/zip/types.ts b/packages/php-wasm/stream-compression/src/zip/types.ts similarity index 100% rename from packages/playground/stream-compression/src/zip/types.ts rename to packages/php-wasm/stream-compression/src/zip/types.ts diff --git a/packages/playground/stream-compression/tsconfig.json b/packages/php-wasm/stream-compression/tsconfig.json similarity index 100% rename from packages/playground/stream-compression/tsconfig.json rename to packages/php-wasm/stream-compression/tsconfig.json diff --git a/packages/playground/stream-compression/tsconfig.lib.json b/packages/php-wasm/stream-compression/tsconfig.lib.json similarity index 67% rename from packages/playground/stream-compression/tsconfig.lib.json rename to packages/php-wasm/stream-compression/tsconfig.lib.json index c63bbb3babe..672fda7d0b9 100644 --- a/packages/playground/stream-compression/tsconfig.lib.json +++ b/packages/php-wasm/stream-compression/tsconfig.lib.json @@ -5,6 +5,10 @@ "declaration": true, "types": ["node", "vite/client"] }, - "include": ["src/**/*.ts", "src/test/vitest-setup-file.ts"], + "include": [ + "src/**/*.ts", + "src/test/vitest-setup-file.ts", + "src/utils/stream-write-to-php.ts" + ], "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] } diff --git a/packages/playground/stream-compression/tsconfig.spec.json b/packages/php-wasm/stream-compression/tsconfig.spec.json similarity index 100% rename from packages/playground/stream-compression/tsconfig.spec.json rename to packages/php-wasm/stream-compression/tsconfig.spec.json diff --git a/packages/playground/stream-compression/vite.config.ts b/packages/php-wasm/stream-compression/vite.config.ts similarity index 91% rename from packages/playground/stream-compression/vite.config.ts rename to packages/php-wasm/stream-compression/vite.config.ts index 32a66277c48..9de3939c524 100644 --- a/packages/playground/stream-compression/vite.config.ts +++ b/packages/php-wasm/stream-compression/vite.config.ts @@ -6,7 +6,7 @@ import * as path from 'path'; import { viteTsConfigPaths } from '../../vite-ts-config-paths'; export default defineConfig({ - cacheDir: '../../../node_modules/.vite/playground-stream-compression', + cacheDir: '../../../node_modules/.vite/php-wasm-stream-compression', plugins: [ dts({ @@ -29,7 +29,7 @@ export default defineConfig({ lib: { // Could also be a dictionary or array of multiple entry points. entry: 'src/index.ts', - name: 'playground-stream-compression', + name: 'php-wasm-stream-compression', fileName: 'index', // Change this to the formats you want to support. // Don't forget to update your package.json as well. diff --git a/packages/php-wasm/universal/src/lib/index.ts b/packages/php-wasm/universal/src/lib/index.ts index 55b1d6b1360..63c5fc6d1ac 100644 --- a/packages/php-wasm/universal/src/lib/index.ts +++ b/packages/php-wasm/universal/src/lib/index.ts @@ -19,6 +19,10 @@ export type { export { UnhandledRejectionsTarget } from './wasm-error-reporting'; +export type { IteratePhpFilesOptions as IterateFilesOptions } from './iterate-files'; +export { iteratePhpFiles as iterateFiles } from './iterate-files'; +export { writeFilesStreamToPhp } from './write-files-stream-to-php'; + export { PHPResponse } from './php-response'; export type { PHPResponseData } from './php-response'; export type { ErrnoError } from './rethrow-file-system-error'; diff --git a/packages/php-wasm/universal/src/lib/iterate-files.ts b/packages/php-wasm/universal/src/lib/iterate-files.ts new file mode 100644 index 00000000000..a14f45f5ad8 --- /dev/null +++ b/packages/php-wasm/universal/src/lib/iterate-files.ts @@ -0,0 +1,71 @@ +import { joinPaths, normalizePath } from '@php-wasm/util'; +import { StreamedFile } from '@php-wasm/stream-compression'; +import { UniversalPHP } from './universal-php'; +import { streamReadFileFromPHP } from './stream-read-file-from-php'; + +export type IteratePhpFilesOptions = { + /** + * Should yield paths relative to the root directory? + * If false, all paths will be absolute. + */ + relativePaths?: boolean; + + /** + * A prefix to add to all paths. + * Only used if `relativePaths` is true. + */ + pathPrefix?: string; + + /** + * A list of paths to exclude from the results. + */ + exceptPaths?: string[]; +}; + +/** + * Iterates over all files in a php directory and its subdirectories. + * + * @param php - The PHP instance. + * @param root - The root directory to start iterating from. + * @param options - Optional configuration. + * @returns All files found in the tree. + */ +export async function* iteratePhpFiles( + php: UniversalPHP, + root: string, + { + relativePaths = true, + pathPrefix, + exceptPaths = [], + }: IteratePhpFilesOptions = {} +): AsyncGenerator { + root = normalizePath(root); + const stack: string[] = [root]; + while (stack.length) { + const currentParent = stack.pop(); + if (!currentParent) { + return; + } + const files = await php.listFiles(currentParent); + for (const file of files) { + const absPath = `${currentParent}/${file}`; + if (exceptPaths.includes(absPath.substring(root.length + 1))) { + continue; + } + const isDir = await php.isDir(absPath); + if (isDir) { + stack.push(absPath); + } else { + yield new StreamedFile( + streamReadFileFromPHP(php, absPath), + relativePaths + ? joinPaths( + pathPrefix || '', + absPath.substring(root.length + 1) + ) + : absPath + ); + } + } + } +} diff --git a/packages/playground/stream-compression/src/utils/stream-write-to-php.ts b/packages/php-wasm/universal/src/lib/write-files-stream-to-php.ts similarity index 78% rename from packages/playground/stream-compression/src/utils/stream-write-to-php.ts rename to packages/php-wasm/universal/src/lib/write-files-stream-to-php.ts index 9726c7c50db..7085b200d5b 100644 --- a/packages/playground/stream-compression/src/utils/stream-write-to-php.ts +++ b/packages/php-wasm/universal/src/lib/write-files-stream-to-php.ts @@ -1,10 +1,10 @@ -import { UniversalPHP } from '@php-wasm/universal'; import { dirname, joinPaths } from '@php-wasm/util'; +import { UniversalPHP } from './universal-php'; /** * Writes streamed files to PHP filesystem. */ -export function streamWriteToPhp(php: UniversalPHP, root: string) { +export function writeFilesStreamToPhp(php: UniversalPHP, root: string) { return new WritableStream({ async write(file: File) { const filePath = joinPaths(root, file.name); diff --git a/packages/php-wasm/util/project.json b/packages/php-wasm/util/project.json index fb3114850b6..a1d059a79df 100644 --- a/packages/php-wasm/util/project.json +++ b/packages/php-wasm/util/project.json @@ -38,5 +38,5 @@ } } }, - "tags": [] + "tags": ["scope:independent-from-php-binaries"] } diff --git a/packages/php-wasm/util/tsconfig.lib.json b/packages/php-wasm/util/tsconfig.lib.json index 829b0bc14c8..0d6d5ff2e98 100644 --- a/packages/php-wasm/util/tsconfig.lib.json +++ b/packages/php-wasm/util/tsconfig.lib.json @@ -5,6 +5,6 @@ "declaration": true, "types": ["node"] }, - "include": ["src/**/*.ts"], + "include": ["src/**/*.ts", "../universal/src/lib/stream-write-to-php.ts"], "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] } diff --git a/packages/php-wasm/web/project.json b/packages/php-wasm/web/project.json index b433f243226..e3687964c56 100644 --- a/packages/php-wasm/web/project.json +++ b/packages/php-wasm/web/project.json @@ -132,5 +132,5 @@ } } }, - "tags": [] + "tags": ["scope:php-binaries"] } diff --git a/packages/playground/stream-compression/README.md b/packages/playground/stream-compression/README.md deleted file mode 100644 index 43f35d56d14..00000000000 --- a/packages/playground/stream-compression/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# playground-stream-compression - -This library was generated with [Nx](https://nx.dev). - -## Building - -Run `nx build playground-stream-compression` to build the library. - -## Running unit tests - -Run `nx test playground-stream-compression` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/tsconfig.base.json b/tsconfig.base.json index 174791bc8b1..266c10c2adc 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -29,6 +29,9 @@ "@php-wasm/private": ["packages/php-wasm/private/src/index.ts"], "@php-wasm/progress": ["packages/php-wasm/progress/src/index.ts"], "@php-wasm/scopes": ["packages/php-wasm/scopes/src/index.ts"], + "@php-wasm/stream-compression": [ + "packages/php-wasm/stream-compression/src/index.ts" + ], "@php-wasm/universal": ["packages/php-wasm/universal/src/index.ts"], "@php-wasm/util": ["packages/php-wasm/util/src/index.ts"], "@php-wasm/web": ["packages/php-wasm/web/src/index.ts"], @@ -51,9 +54,6 @@ "@wp-playground/storage": [ "packages/playground/storage/src/index.ts" ], - "@wp-playground/stream-compression": [ - "packages/playground/stream-compression/src/index.ts" - ], "@wp-playground/sync": ["packages/playground/sync/src/index.ts"], "@wp-playground/unit-test-utils": [ "packages/playground/unit-test-utils/src/index.ts" From abe15f0ca5e94a671e083f1915f908947abb26ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zieli=C5=84ski?= Date: Fri, 22 Dec 2023 11:41:55 +0100 Subject: [PATCH 2/2] Add a missing file --- .../universal/src/lib/stream-read-file-from-php.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 packages/php-wasm/universal/src/lib/stream-read-file-from-php.ts diff --git a/packages/php-wasm/universal/src/lib/stream-read-file-from-php.ts b/packages/php-wasm/universal/src/lib/stream-read-file-from-php.ts new file mode 100644 index 00000000000..e855762b2a1 --- /dev/null +++ b/packages/php-wasm/universal/src/lib/stream-read-file-from-php.ts @@ -0,0 +1,14 @@ +import { UniversalPHP } from './universal-php'; + +/** + * Reads a file from PHP filesystem using a stream. + */ +export function streamReadFileFromPHP(php: UniversalPHP, path: string) { + return new ReadableStream({ + async pull(controller) { + const buffer = await php.readFileAsBuffer(path); + controller.enqueue(buffer); + controller.close(); + }, + }); +}