@powerlines/core 0.15.18 → 0.15.19
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/constants/api.mjs.map +1 -1
- package/dist/constants/commands.mjs.map +1 -1
- package/dist/constants/extensions.mjs.map +1 -1
- package/dist/constants/fs.mjs.map +1 -1
- package/dist/constants/hooks.mjs.map +1 -1
- package/dist/constants/log-level.d.cts +1 -1
- package/dist/constants/log-level.d.mts +1 -1
- package/dist/constants/log-level.mjs.map +1 -1
- package/dist/constants/plugin.mjs.map +1 -1
- package/dist/context/base-context.cjs +2 -8
- package/dist/context/base-context.d.cts.map +1 -1
- package/dist/context/base-context.d.mts.map +1 -1
- package/dist/context/base-context.mjs +2 -8
- package/dist/context/base-context.mjs.map +1 -1
- package/dist/context/context.cjs +2 -1
- package/dist/context/context.d.cts.map +1 -1
- package/dist/context/context.d.mts.map +1 -1
- package/dist/context/context.mjs +2 -1
- package/dist/context/context.mjs.map +1 -1
- package/dist/context/environment-context.mjs.map +1 -1
- package/dist/context/execution-context.d.cts.map +1 -1
- package/dist/context/execution-context.d.mts.map +1 -1
- package/dist/context/execution-context.mjs.map +1 -1
- package/dist/context/plugin-context.mjs.map +1 -1
- package/dist/lib/config.d.cts.map +1 -1
- package/dist/lib/config.d.mts.map +1 -1
- package/dist/lib/config.mjs.map +1 -1
- package/dist/lib/context-helpers.d.cts +4 -7
- package/dist/lib/context-helpers.d.cts.map +1 -1
- package/dist/lib/context-helpers.d.mts +4 -7
- package/dist/lib/context-helpers.d.mts.map +1 -1
- package/dist/lib/context-helpers.mjs.map +1 -1
- package/dist/lib/entry.d.cts.map +1 -1
- package/dist/lib/entry.d.mts.map +1 -1
- package/dist/lib/entry.mjs.map +1 -1
- package/dist/lib/environment.mjs.map +1 -1
- package/dist/lib/events.mjs.map +1 -1
- package/dist/lib/generate-types.d.cts.map +1 -1
- package/dist/lib/generate-types.d.mts.map +1 -1
- package/dist/lib/generate-types.mjs.map +1 -1
- package/dist/lib/hooks.mjs.map +1 -1
- package/dist/lib/install-dependencies.mjs.map +1 -1
- package/dist/lib/meta.d.cts.map +1 -1
- package/dist/lib/meta.d.mts.map +1 -1
- package/dist/lib/meta.mjs.map +1 -1
- package/dist/lib/plugins.d.cts.map +1 -1
- package/dist/lib/plugins.d.mts.map +1 -1
- package/dist/lib/plugins.mjs.map +1 -1
- package/dist/lib/resolver.d.cts.map +1 -1
- package/dist/lib/resolver.d.mts.map +1 -1
- package/dist/lib/resolver.mjs.map +1 -1
- package/dist/lib/streaming-channel.d.cts.map +1 -1
- package/dist/lib/streaming-channel.d.mts.map +1 -1
- package/dist/lib/streaming-channel.mjs.map +1 -1
- package/dist/lib/typescript/ts-morph.mjs.map +1 -1
- package/dist/lib/typescript/tsconfig.d.cts.map +1 -1
- package/dist/lib/typescript/tsconfig.d.mts.map +1 -1
- package/dist/lib/typescript/tsconfig.mjs.map +1 -1
- package/dist/lib/unplugin/helpers.d.cts.map +1 -1
- package/dist/lib/unplugin/helpers.d.mts.map +1 -1
- package/dist/lib/unplugin/helpers.mjs.map +1 -1
- package/dist/lib/unplugin/module-resolution.d.cts.map +1 -1
- package/dist/lib/unplugin/module-resolution.d.mts.map +1 -1
- package/dist/lib/unplugin/module-resolution.mjs.map +1 -1
- package/dist/lib/unplugin/plugin.d.cts.map +1 -1
- package/dist/lib/unplugin/plugin.d.mts.map +1 -1
- package/dist/lib/unplugin/plugin.mjs.map +1 -1
- package/dist/lib/utilities/file-header.d.cts.map +1 -1
- package/dist/lib/utilities/file-header.d.mts.map +1 -1
- package/dist/lib/utilities/file-header.mjs.map +1 -1
- package/dist/lib/utilities/format.d.cts.map +1 -1
- package/dist/lib/utilities/format.d.mts.map +1 -1
- package/dist/lib/utilities/format.mjs.map +1 -1
- package/dist/lib/utilities/source-file.d.cts.map +1 -1
- package/dist/lib/utilities/source-file.d.mts.map +1 -1
- package/dist/lib/utilities/source-file.mjs.map +1 -1
- package/dist/lib/utilities/source-map.d.cts.map +1 -1
- package/dist/lib/utilities/source-map.d.mts.map +1 -1
- package/dist/lib/utilities/source-map.mjs.map +1 -1
- package/dist/lib/utilities/write-file.mjs.map +1 -1
- package/dist/lib/vfs.d.cts.map +1 -1
- package/dist/lib/vfs.d.mts.map +1 -1
- package/dist/lib/vfs.mjs.map +1 -1
- package/dist/plugin-base.d.cts.map +1 -1
- package/dist/plugin-base.d.mts.map +1 -1
- package/dist/plugin-base.mjs.map +1 -1
- package/dist/plugin-utils/build-helpers.d.cts.map +1 -1
- package/dist/plugin-utils/build-helpers.d.mts.map +1 -1
- package/dist/plugin-utils/build-helpers.mjs.map +1 -1
- package/dist/plugin-utils/combine-plugins.d.cts +6 -7
- package/dist/plugin-utils/combine-plugins.d.cts.map +1 -1
- package/dist/plugin-utils/combine-plugins.d.mts +6 -7
- package/dist/plugin-utils/combine-plugins.d.mts.map +1 -1
- package/dist/plugin-utils/combine-plugins.mjs.map +1 -1
- package/dist/plugin-utils/context-helpers.d.cts.map +1 -1
- package/dist/plugin-utils/context-helpers.d.mts.map +1 -1
- package/dist/plugin-utils/context-helpers.mjs.map +1 -1
- package/dist/plugin-utils/docs-helper.d.cts.map +1 -1
- package/dist/plugin-utils/docs-helper.d.mts.map +1 -1
- package/dist/plugin-utils/docs-helper.mjs.map +1 -1
- package/dist/plugin-utils/enable-plugin.mjs.map +1 -1
- package/dist/plugin-utils/extend.mjs.map +1 -1
- package/dist/plugin-utils/filter.d.cts.map +1 -1
- package/dist/plugin-utils/filter.d.mts.map +1 -1
- package/dist/plugin-utils/filter.mjs.map +1 -1
- package/dist/plugin-utils/format-package-json.mjs.map +1 -1
- package/dist/plugin-utils/format.d.cts.map +1 -1
- package/dist/plugin-utils/format.d.mts.map +1 -1
- package/dist/plugin-utils/format.mjs.map +1 -1
- package/dist/plugin-utils/get-config-path.d.cts.map +1 -1
- package/dist/plugin-utils/get-config-path.d.mts.map +1 -1
- package/dist/plugin-utils/get-config-path.mjs.map +1 -1
- package/dist/plugin-utils/helpers.d.cts +10 -13
- package/dist/plugin-utils/helpers.d.cts.map +1 -1
- package/dist/plugin-utils/helpers.d.mts +10 -13
- package/dist/plugin-utils/helpers.d.mts.map +1 -1
- package/dist/plugin-utils/helpers.mjs.map +1 -1
- package/dist/plugin-utils/install.d.cts.map +1 -1
- package/dist/plugin-utils/install.d.mts.map +1 -1
- package/dist/plugin-utils/install.mjs.map +1 -1
- package/dist/plugin-utils/logging.d.cts.map +1 -1
- package/dist/plugin-utils/logging.d.mts.map +1 -1
- package/dist/plugin-utils/logging.mjs.map +1 -1
- package/dist/plugin-utils/merge.d.cts.map +1 -1
- package/dist/plugin-utils/merge.d.mts.map +1 -1
- package/dist/plugin-utils/merge.mjs.map +1 -1
- package/dist/plugin-utils/modules.d.cts.map +1 -1
- package/dist/plugin-utils/modules.d.mts.map +1 -1
- package/dist/plugin-utils/modules.mjs.map +1 -1
- package/dist/plugin-utils/paths.cjs +1 -1
- package/dist/plugin-utils/paths.d.cts.map +1 -1
- package/dist/plugin-utils/paths.d.mts.map +1 -1
- package/dist/plugin-utils/paths.mjs +1 -1
- package/dist/plugin-utils/paths.mjs.map +1 -1
- package/dist/plugin-utils/virtual.d.cts.map +1 -1
- package/dist/plugin-utils/virtual.d.mts.map +1 -1
- package/dist/plugin-utils/virtual.mjs.map +1 -1
- package/dist/schemas/fs.d.cts.map +1 -1
- package/dist/schemas/fs.d.mts.map +1 -1
- package/dist/schemas/fs.mjs.map +1 -1
- package/dist/storage/base.cjs +1 -0
- package/dist/storage/base.d.cts.map +1 -1
- package/dist/storage/base.d.mts.map +1 -1
- package/dist/storage/base.mjs +1 -0
- package/dist/storage/base.mjs.map +1 -1
- package/dist/storage/file-system.d.cts.map +1 -1
- package/dist/storage/file-system.d.mts.map +1 -1
- package/dist/storage/file-system.mjs.map +1 -1
- package/dist/storage/helpers.d.cts.map +1 -1
- package/dist/storage/helpers.d.mts.map +1 -1
- package/dist/storage/helpers.mjs.map +1 -1
- package/dist/storage/virtual.d.cts.map +1 -1
- package/dist/storage/virtual.d.mts.map +1 -1
- package/dist/storage/virtual.mjs.map +1 -1
- package/dist/types/api.d.cts.map +1 -1
- package/dist/types/api.d.mts.map +1 -1
- package/dist/types/config.d.cts.map +1 -1
- package/dist/types/config.d.mts.map +1 -1
- package/dist/types/context.d.cts.map +1 -1
- package/dist/types/context.d.mts.map +1 -1
- package/dist/types/fs.d.cts.map +1 -1
- package/dist/types/fs.d.mts.map +1 -1
- package/dist/types/hooks.d.cts.map +1 -1
- package/dist/types/hooks.d.mts.map +1 -1
- package/dist/types/logging.d.cts.map +1 -1
- package/dist/types/logging.d.mts.map +1 -1
- package/dist/types/plugin.d.cts.map +1 -1
- package/dist/types/plugin.d.mts.map +1 -1
- package/dist/types/tsconfig.d.cts.map +1 -1
- package/dist/types/tsconfig.d.mts.map +1 -1
- package/dist/types/unplugin.d.cts.map +1 -1
- package/dist/types/unplugin.d.mts.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-channel.mjs","names":[],"sources":["../../src/lib/streaming-channel.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { nanoid } from \"@stryke/unique-id/nanoid-client\";\nimport type { EventEmitter } from \"devframe/types\";\nimport { createEventEmitter } from \"./events\";\n\n/**\n * Serialized error shape sent over the wire when a stream ends with a failure.\n * Stays JSON-safe so the strict-JSON encoder can carry it without coercion.\n */\nexport interface StreamErrorPayload {\n name: string;\n message: string;\n}\n\n/**\n * Single buffered chunk in the server-side ring buffer.\n *\n * Sequence numbers start at 1 and increment per write. Subscribers track\n * `lastSeenSeq` and ask for `afterSeq` on resubscribe so the server can\n * replay any chunks the client missed during a brief disconnect.\n */\nexport interface BufferedChunk<T> {\n seq: number;\n chunk: T;\n}\n\nexport interface StreamSinkEvents<T> {\n /** Fired for each `write()`. The RPC layer subscribes and broadcasts. */\n chunk: (seq: number, chunk: T) => void;\n /** Terminal — fired exactly once per sink lifetime. */\n end: (error?: StreamErrorPayload) => void;\n}\n\nexport interface CreateStreamSinkOptions {\n id?: string;\n /**\n * Size of the per-stream ring buffer kept for replay-on-resubscribe.\n * `0` (default) disables replay.\n */\n replayWindow?: number;\n}\n\n/**\n * Server-side producer handle. Two equivalent surfaces share one piece of\n * state: the imperative `write/error/close` triple, and a `WritableStream<T>`\n * for `pipeTo`-style consumption.\n */\nexport interface StreamSink<T> {\n /** Stable id used by clients to subscribe. */\n readonly id: string;\n /**\n * Aborts when the consumer cancels (server-side) or when the transport\n * loses every subscriber. Producers should poll `signal.aborted` and exit\n * cleanly.\n */\n readonly signal: AbortSignal;\n /** `true` after `close()` / `error()`. Further writes throw. */\n readonly closed: boolean;\n /** Last allocated sequence number. `0` until the first write. */\n readonly lastSeq: number;\n\n write: (chunk: T) => void;\n error: (reason: unknown) => void;\n close: () => void;\n /** External-cancel path. Aborts the signal so handlers can short-circuit. */\n abort: (reason?: unknown) => void;\n\n /** `WritableStream<T>` adapter — same in-memory state as the imperative API. */\n readonly writable: WritableStream<T>;\n\n /**\n * Internal — RPC layer subscribes to receive chunk/end notifications.\n * Not part of the public contract; do not call directly.\n *\n * @internal\n */\n readonly events: EventEmitter<StreamSinkEvents<T>>;\n\n /**\n * Internal — replay buffer. RPC layer reads on (re)subscribe to feed\n * missed chunks before going live.\n *\n * @internal\n */\n readonly buffer: ReadonlyArray<BufferedChunk<T>>;\n}\n\nexport interface CreateStreamReaderOptions {\n id?: string;\n /**\n * Maximum number of buffered chunks held client-side while the consumer\n * isn't draining. On overflow, the oldest chunk is dropped.\n */\n highWaterMark?: number;\n /**\n * Called when the chunk queue overflows the high-water mark. The RPC\n * layer wires this to a coded warning; the primitive itself is\n * RPC-agnostic.\n */\n onOverflow?: (dropped: number) => void;\n /** Called when the consumer cancels — the RPC layer sends `:cancel` upstream. */\n onCancel?: () => void;\n}\n\n/**\n * Client-side consumer handle. Both an `AsyncIterable<T>` (for `for await`)\n * and exposes `readable: ReadableStream<T>` (for `pipeTo`). Pick one — they\n * share a single internal queue, so concurrent draining will race.\n */\nexport interface StreamReader<T> extends AsyncIterable<T> {\n readonly id: string;\n readonly cancelled: boolean;\n readonly done: boolean;\n /** Highest `seq` observed. Used for replay on reconnect. */\n readonly lastSeenSeq: number;\n /** `ReadableStream<T>` adapter for `pipeTo`-style consumption. */\n readonly readable: ReadableStream<T>;\n\n cancel: () => void;\n\n /** @internal */\n _push: (seq: number, chunk: T) => void;\n /** @internal */\n _end: (error?: StreamErrorPayload) => void;\n}\n\nconst DEFAULT_HIGH_WATER_MARK = 256;\n\nclass StreamClosedError extends Error {\n override name = \"StreamClosedError\";\n}\n\n/**\n * Build a server-side stream sink. RPC-agnostic — the RPC host wires\n * `events.on('chunk' | 'end')` to broadcast, and reads `buffer` to replay\n * for late or reconnecting subscribers.\n */\nexport function createStreamSink<T>(\n options: CreateStreamSinkOptions = {}\n): StreamSink<T> {\n const id = options.id ?? nanoid();\n const replayWindow = Math.max(0, options.replayWindow ?? 0);\n const events = createEventEmitter<StreamSinkEvents<T>>();\n const controller = new AbortController();\n const buffer: BufferedChunk<T>[] = [];\n\n let closed = false;\n let lastSeq = 0;\n\n function write(chunk: T): void {\n if (closed) {\n throw new StreamClosedError(`Cannot write to a closed stream \"${id}\"`);\n }\n lastSeq += 1;\n if (replayWindow > 0) {\n buffer.push({ seq: lastSeq, chunk });\n if (buffer.length > replayWindow)\n buffer.splice(0, buffer.length - replayWindow);\n }\n events.emit(\"chunk\", lastSeq, chunk);\n }\n\n function error(reason: unknown): void {\n if (closed) return;\n closed = true;\n const payload = toErrorPayload(reason);\n controller.abort(reason);\n events.emit(\"end\", payload);\n }\n\n function close(): void {\n if (closed) return;\n closed = true;\n if (!controller.signal.aborted) controller.abort(\"stream closed\");\n events.emit(\"end\", undefined);\n }\n\n function abort(reason?: unknown): void {\n if (closed) return;\n if (!controller.signal.aborted) controller.abort(reason ?? \"aborted\");\n }\n\n const writable = new WritableStream<T>({\n write(chunk) {\n write(chunk);\n },\n close() {\n close();\n },\n abort(reason) {\n error(reason);\n }\n });\n\n return {\n id,\n signal: controller.signal,\n get closed() {\n return closed;\n },\n get lastSeq() {\n return lastSeq;\n },\n write,\n error,\n close,\n abort,\n writable,\n events,\n buffer\n };\n}\n\n/**\n * Build a client-side stream reader. RPC-agnostic — the RPC host calls\n * `_push(seq, chunk)` on each incoming chunk and `_end(error?)` on the\n * terminal frame. Consumers iterate with `for await` or pipe `readable`.\n */\nexport function createStreamReader<T>(\n options: CreateStreamReaderOptions = {}\n): StreamReader<T> {\n const id = options.id ?? nanoid();\n const highWaterMark = Math.max(\n 1,\n options.highWaterMark ?? DEFAULT_HIGH_WATER_MARK\n );\n\n const queue: T[] = [];\n let lastSeenSeq = 0;\n let done = false;\n let cancelled = false;\n let endError: StreamErrorPayload | undefined;\n let pending:\n | {\n resolve: (r: IteratorResult<T>) => void;\n reject: (err: unknown) => void;\n }\n | undefined;\n // Lazily created — accessing `reader.readable` claims the queue for\n // `pipeTo` consumption. While inactive, `_push` only feeds the\n // AsyncIterator path. Mixing the two surfaces is undefined behavior.\n let pullController: ReadableStreamDefaultController<T> | undefined;\n let readableInstance: ReadableStream<T> | undefined;\n\n function drainNext(): void {\n if (!pending) return;\n if (queue.length > 0) {\n const value = queue.shift()!;\n const r = pending;\n pending = undefined;\n r.resolve({ value, done: false });\n return;\n }\n if (done) {\n const r = pending;\n pending = undefined;\n if (endError) {\n const err = new Error(endError.message);\n err.name = endError.name;\n r.reject(err);\n } else {\n r.resolve({ value: undefined, done: true });\n }\n }\n }\n\n function feedReadable(): void {\n if (!pullController) return;\n while (queue.length > 0) {\n const v = queue.shift()!;\n try {\n pullController.enqueue(v);\n } catch {\n // controller closed/errored under us — drop silently; the\n // ReadableStream consumer is gone and we can't push further.\n break;\n }\n }\n if (done && pullController) {\n try {\n if (endError) {\n const err = new Error(endError.message);\n err.name = endError.name;\n pullController.error(err);\n } else {\n pullController.close();\n }\n } catch {\n // already closed\n }\n pullController = undefined;\n }\n }\n\n function push(seq: number, chunk: T): void {\n if (done || cancelled) return;\n if (seq <= lastSeenSeq) return; // dedupe replays we've already seen\n lastSeenSeq = seq;\n queue.push(chunk);\n if (queue.length > highWaterMark) {\n const overflow = queue.length - highWaterMark;\n queue.splice(0, overflow);\n options.onOverflow?.(overflow);\n }\n drainNext();\n if (readableInstance) feedReadable();\n }\n\n function end(error?: StreamErrorPayload): void {\n if (done) return;\n done = true;\n endError = error;\n drainNext();\n if (readableInstance) feedReadable();\n }\n\n function cancel(): void {\n if (cancelled || done) return;\n cancelled = true;\n options.onCancel?.();\n end(undefined);\n }\n\n function getReadable(): ReadableStream<T> {\n if (readableInstance) return readableInstance;\n readableInstance = new ReadableStream<T>({\n start(controller) {\n pullController = controller;\n feedReadable();\n },\n cancel() {\n cancel();\n }\n });\n return readableInstance;\n }\n\n const reader: StreamReader<T> = {\n id,\n get cancelled() {\n return cancelled;\n },\n get done() {\n return done;\n },\n get lastSeenSeq() {\n return lastSeenSeq;\n },\n get readable() {\n return getReadable();\n },\n cancel,\n _push: push,\n _end: end,\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n async next(): Promise<IteratorResult<T>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n if (done) {\n if (endError) {\n const err = new Error(endError.message);\n err.name = endError.name;\n return Promise.reject(err);\n }\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true\n });\n }\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n pending = { resolve, reject };\n });\n },\n async return(): Promise<IteratorResult<T>> {\n cancel();\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true\n });\n }\n };\n }\n };\n\n return reader;\n}\n\nfunction toErrorPayload(reason: unknown): StreamErrorPayload {\n if (reason instanceof Error) {\n return { name: reason.name || \"Error\", message: reason.message };\n }\n if (typeof reason === \"string\") {\n return { name: \"Error\", message: reason };\n }\n try {\n return { name: \"Error\", message: JSON.stringify(reason) };\n } catch {\n return { name: \"Error\", message: String(reason) };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"streaming-channel.mjs","names":[],"sources":["../../src/lib/streaming-channel.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { nanoid } from \"@stryke/unique-id/nanoid-client\";\nimport type { EventEmitter } from \"devframe/types\";\nimport { createEventEmitter } from \"./events\";\n\n/**\n * Serialized error shape sent over the wire when a stream ends with a failure.\n * Stays JSON-safe so the strict-JSON encoder can carry it without coercion.\n */\nexport interface StreamErrorPayload {\n name: string;\n message: string;\n}\n\n/**\n * Single buffered chunk in the server-side ring buffer.\n *\n * Sequence numbers start at 1 and increment per write. Subscribers track\n * `lastSeenSeq` and ask for `afterSeq` on resubscribe so the server can\n * replay any chunks the client missed during a brief disconnect.\n */\nexport interface BufferedChunk<T> {\n seq: number;\n chunk: T;\n}\n\nexport interface StreamSinkEvents<T> {\n /** Fired for each `write()`. The RPC layer subscribes and broadcasts. */\n chunk: (seq: number, chunk: T) => void;\n /** Terminal — fired exactly once per sink lifetime. */\n end: (error?: StreamErrorPayload) => void;\n}\n\nexport interface CreateStreamSinkOptions {\n id?: string;\n /**\n * Size of the per-stream ring buffer kept for replay-on-resubscribe.\n * `0` (default) disables replay.\n */\n replayWindow?: number;\n}\n\n/**\n * Server-side producer handle. Two equivalent surfaces share one piece of\n * state: the imperative `write/error/close` triple, and a `WritableStream<T>`\n * for `pipeTo`-style consumption.\n */\nexport interface StreamSink<T> {\n /** Stable id used by clients to subscribe. */\n readonly id: string;\n /**\n * Aborts when the consumer cancels (server-side) or when the transport\n * loses every subscriber. Producers should poll `signal.aborted` and exit\n * cleanly.\n */\n readonly signal: AbortSignal;\n /** `true` after `close()` / `error()`. Further writes throw. */\n readonly closed: boolean;\n /** Last allocated sequence number. `0` until the first write. */\n readonly lastSeq: number;\n\n write: (chunk: T) => void;\n error: (reason: unknown) => void;\n close: () => void;\n /** External-cancel path. Aborts the signal so handlers can short-circuit. */\n abort: (reason?: unknown) => void;\n\n /** `WritableStream<T>` adapter — same in-memory state as the imperative API. */\n readonly writable: WritableStream<T>;\n\n /**\n * Internal — RPC layer subscribes to receive chunk/end notifications.\n * Not part of the public contract; do not call directly.\n *\n * @internal\n */\n readonly events: EventEmitter<StreamSinkEvents<T>>;\n\n /**\n * Internal — replay buffer. RPC layer reads on (re)subscribe to feed\n * missed chunks before going live.\n *\n * @internal\n */\n readonly buffer: ReadonlyArray<BufferedChunk<T>>;\n}\n\nexport interface CreateStreamReaderOptions {\n id?: string;\n /**\n * Maximum number of buffered chunks held client-side while the consumer\n * isn't draining. On overflow, the oldest chunk is dropped.\n */\n highWaterMark?: number;\n /**\n * Called when the chunk queue overflows the high-water mark. The RPC\n * layer wires this to a coded warning; the primitive itself is\n * RPC-agnostic.\n */\n onOverflow?: (dropped: number) => void;\n /** Called when the consumer cancels — the RPC layer sends `:cancel` upstream. */\n onCancel?: () => void;\n}\n\n/**\n * Client-side consumer handle. Both an `AsyncIterable<T>` (for `for await`)\n * and exposes `readable: ReadableStream<T>` (for `pipeTo`). Pick one — they\n * share a single internal queue, so concurrent draining will race.\n */\nexport interface StreamReader<T> extends AsyncIterable<T> {\n readonly id: string;\n readonly cancelled: boolean;\n readonly done: boolean;\n /** Highest `seq` observed. Used for replay on reconnect. */\n readonly lastSeenSeq: number;\n /** `ReadableStream<T>` adapter for `pipeTo`-style consumption. */\n readonly readable: ReadableStream<T>;\n\n cancel: () => void;\n\n /** @internal */\n _push: (seq: number, chunk: T) => void;\n /** @internal */\n _end: (error?: StreamErrorPayload) => void;\n}\n\nconst DEFAULT_HIGH_WATER_MARK = 256;\n\nclass StreamClosedError extends Error {\n override name = \"StreamClosedError\";\n}\n\n/**\n * Build a server-side stream sink. RPC-agnostic — the RPC host wires\n * `events.on('chunk' | 'end')` to broadcast, and reads `buffer` to replay\n * for late or reconnecting subscribers.\n */\nexport function createStreamSink<T>(\n options: CreateStreamSinkOptions = {}\n): StreamSink<T> {\n const id = options.id ?? nanoid();\n const replayWindow = Math.max(0, options.replayWindow ?? 0);\n const events = createEventEmitter<StreamSinkEvents<T>>();\n const controller = new AbortController();\n const buffer: BufferedChunk<T>[] = [];\n\n let closed = false;\n let lastSeq = 0;\n\n function write(chunk: T): void {\n if (closed) {\n throw new StreamClosedError(`Cannot write to a closed stream \"${id}\"`);\n }\n lastSeq += 1;\n if (replayWindow > 0) {\n buffer.push({ seq: lastSeq, chunk });\n if (buffer.length > replayWindow)\n buffer.splice(0, buffer.length - replayWindow);\n }\n events.emit(\"chunk\", lastSeq, chunk);\n }\n\n function error(reason: unknown): void {\n if (closed) return;\n closed = true;\n const payload = toErrorPayload(reason);\n controller.abort(reason);\n events.emit(\"end\", payload);\n }\n\n function close(): void {\n if (closed) return;\n closed = true;\n if (!controller.signal.aborted) controller.abort(\"stream closed\");\n events.emit(\"end\", undefined);\n }\n\n function abort(reason?: unknown): void {\n if (closed) return;\n if (!controller.signal.aborted) controller.abort(reason ?? \"aborted\");\n }\n\n const writable = new WritableStream<T>({\n write(chunk) {\n write(chunk);\n },\n close() {\n close();\n },\n abort(reason) {\n error(reason);\n }\n });\n\n return {\n id,\n signal: controller.signal,\n get closed() {\n return closed;\n },\n get lastSeq() {\n return lastSeq;\n },\n write,\n error,\n close,\n abort,\n writable,\n events,\n buffer\n };\n}\n\n/**\n * Build a client-side stream reader. RPC-agnostic — the RPC host calls\n * `_push(seq, chunk)` on each incoming chunk and `_end(error?)` on the\n * terminal frame. Consumers iterate with `for await` or pipe `readable`.\n */\nexport function createStreamReader<T>(\n options: CreateStreamReaderOptions = {}\n): StreamReader<T> {\n const id = options.id ?? nanoid();\n const highWaterMark = Math.max(\n 1,\n options.highWaterMark ?? DEFAULT_HIGH_WATER_MARK\n );\n\n const queue: T[] = [];\n let lastSeenSeq = 0;\n let done = false;\n let cancelled = false;\n let endError: StreamErrorPayload | undefined;\n let pending:\n | {\n resolve: (r: IteratorResult<T>) => void;\n reject: (err: unknown) => void;\n }\n | undefined;\n // Lazily created — accessing `reader.readable` claims the queue for\n // `pipeTo` consumption. While inactive, `_push` only feeds the\n // AsyncIterator path. Mixing the two surfaces is undefined behavior.\n let pullController: ReadableStreamDefaultController<T> | undefined;\n let readableInstance: ReadableStream<T> | undefined;\n\n function drainNext(): void {\n if (!pending) return;\n if (queue.length > 0) {\n const value = queue.shift()!;\n const r = pending;\n pending = undefined;\n r.resolve({ value, done: false });\n return;\n }\n if (done) {\n const r = pending;\n pending = undefined;\n if (endError) {\n const err = new Error(endError.message);\n err.name = endError.name;\n r.reject(err);\n } else {\n r.resolve({ value: undefined, done: true });\n }\n }\n }\n\n function feedReadable(): void {\n if (!pullController) return;\n while (queue.length > 0) {\n const v = queue.shift()!;\n try {\n pullController.enqueue(v);\n } catch {\n // controller closed/errored under us — drop silently; the\n // ReadableStream consumer is gone and we can't push further.\n break;\n }\n }\n if (done && pullController) {\n try {\n if (endError) {\n const err = new Error(endError.message);\n err.name = endError.name;\n pullController.error(err);\n } else {\n pullController.close();\n }\n } catch {\n // already closed\n }\n pullController = undefined;\n }\n }\n\n function push(seq: number, chunk: T): void {\n if (done || cancelled) return;\n if (seq <= lastSeenSeq) return; // dedupe replays we've already seen\n lastSeenSeq = seq;\n queue.push(chunk);\n if (queue.length > highWaterMark) {\n const overflow = queue.length - highWaterMark;\n queue.splice(0, overflow);\n options.onOverflow?.(overflow);\n }\n drainNext();\n if (readableInstance) feedReadable();\n }\n\n function end(error?: StreamErrorPayload): void {\n if (done) return;\n done = true;\n endError = error;\n drainNext();\n if (readableInstance) feedReadable();\n }\n\n function cancel(): void {\n if (cancelled || done) return;\n cancelled = true;\n options.onCancel?.();\n end(undefined);\n }\n\n function getReadable(): ReadableStream<T> {\n if (readableInstance) return readableInstance;\n readableInstance = new ReadableStream<T>({\n start(controller) {\n pullController = controller;\n feedReadable();\n },\n cancel() {\n cancel();\n }\n });\n return readableInstance;\n }\n\n const reader: StreamReader<T> = {\n id,\n get cancelled() {\n return cancelled;\n },\n get done() {\n return done;\n },\n get lastSeenSeq() {\n return lastSeenSeq;\n },\n get readable() {\n return getReadable();\n },\n cancel,\n _push: push,\n _end: end,\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n async next(): Promise<IteratorResult<T>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n if (done) {\n if (endError) {\n const err = new Error(endError.message);\n err.name = endError.name;\n return Promise.reject(err);\n }\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true\n });\n }\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n pending = { resolve, reject };\n });\n },\n async return(): Promise<IteratorResult<T>> {\n cancel();\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true\n });\n }\n };\n }\n };\n\n return reader;\n}\n\nfunction toErrorPayload(reason: unknown): StreamErrorPayload {\n if (reason instanceof Error) {\n return { name: reason.name || \"Error\", message: reason.message };\n }\n if (typeof reason === \"string\") {\n return { name: \"Error\", message: reason };\n }\n try {\n return { name: \"Error\", message: JSON.stringify(reason) };\n } catch {\n return { name: \"Error\", message: String(reason) };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-morph.mjs","names":["#context"],"sources":["../../../src/lib/typescript/ts-morph.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport defu from \"defu\";\nimport {\n CompilerOptions,\n FileSystemHost,\n InMemoryFileSystemHost,\n Project,\n ProjectOptions,\n RuntimeDirEntry\n} from \"ts-morph\";\nimport type { Context } from \"../../types/context\";\n\nexport class VirtualFileSystemHost\n extends InMemoryFileSystemHost\n implements FileSystemHost\n{\n #context: Context;\n\n public constructor(context: Context) {\n super();\n\n this.#context = context;\n }\n\n public override deleteSync(path: string) {\n this.#context.fs.removeSync(path);\n }\n\n public override readDirSync(dirPath: string): RuntimeDirEntry[] {\n if (!this.#context.fs.isDirectorySync(dirPath)) {\n return [];\n }\n\n return this.#context.fs.listSync(dirPath).reduce((ret, entry) => {\n const fullPath = this.#context.fs.resolveSync(entry);\n if (fullPath) {\n ret.push({\n name: entry,\n isDirectory: this.#context.fs.isDirectorySync(fullPath),\n isFile: this.#context.fs.isFileSync(fullPath),\n isSymlink: false\n });\n }\n\n return ret;\n }, [] as RuntimeDirEntry[]);\n }\n\n public override async readFile(filePath: string) {\n if (!this.#context.fs.isFileSync(filePath)) {\n return \"\";\n }\n\n return (await this.#context.fs.read(filePath))!;\n }\n\n public override readFileSync(filePath: string) {\n if (!this.#context.fs.isFileSync(filePath)) {\n return \"\";\n }\n\n return this.#context.fs.readSync(filePath)!;\n }\n\n public override async writeFile(filePath: string, fileText: string) {\n return this.#context.fs.write(filePath, fileText);\n }\n\n public override writeFileSync(filePath: string, fileText: string) {\n this.#context.fs.writeSync(filePath, fileText);\n }\n\n public override async mkdir(dirPath: string) {\n await this.#context.fs.mkdir(dirPath);\n }\n\n public override mkdirSync(dirPath: string) {\n this.#context.fs.mkdirSync(dirPath);\n }\n\n public override async move(srcPath: string, destPath: string) {\n await this.#context.fs.move(srcPath, destPath);\n }\n\n public override moveSync(srcPath: string, destPath: string) {\n this.#context.fs.moveSync(srcPath, destPath);\n }\n\n public override async copy(srcPath: string, destPath: string) {\n await this.#context.fs.copy(srcPath, destPath);\n }\n\n public override copySync(srcPath: string, destPath: string) {\n this.#context.fs.copySync(srcPath, destPath);\n }\n\n public override async fileExists(filePath: string) {\n return this.#context.fs.isFile(filePath);\n }\n\n public override fileExistsSync(filePath: string) {\n return this.#context.fs.isFileSync(filePath);\n }\n\n public override async directoryExists(dirPath: string) {\n return this.#context.fs.isDirectory(dirPath);\n }\n\n public override directoryExistsSync(dirPath: string): boolean {\n return this.#context.fs.isDirectorySync(dirPath);\n }\n\n public override realpathSync(path: string) {\n return this.#context.fs.resolveSync(path) || path;\n }\n\n public override getCurrentDirectory() {\n return this.#context.config.cwd;\n }\n\n public override async glob(\n patterns: ReadonlyArray<string>\n ): Promise<string[]> {\n return this.#context.fs.glob(patterns as string[]);\n }\n\n public override globSync(patterns: ReadonlyArray<string>): string[] {\n return this.#context.fs.globSync(patterns as string[]);\n }\n}\n\n/**\n * Create a ts-morph {@link Project} instance used for type reflection and module manipulation during processing\n *\n * @param context - The Powerlines context\n * @returns A ts-morph {@link Project} instance\n */\nexport function createProgram(\n context: Context,\n override: Partial<ProjectOptions>\n): Project {\n context.debug(\n `Creating ts-morph Project instance with configuration from: ${\n context.tsconfig.tsconfigFilePath\n }.`\n );\n\n const project = new Project(\n defu(override ?? {}, {\n skipAddingFilesFromTsConfig: false,\n tsConfigFilePath: context.tsconfig.tsconfigFilePath,\n fileSystem: new VirtualFileSystemHost(context),\n compilerOptions: defu(context.tsconfig.options ?? {}, {\n lib: [\"lib.esnext.full.d.ts\"]\n }) as CompilerOptions\n })\n );\n\n return project;\n}\n"],"mappings":";;;;AA6BA,IAAa,wBAAb,cACU,uBAEV;CACE;CAEA,AAAO,YAAY,SAAkB;
|
|
1
|
+
{"version":3,"file":"ts-morph.mjs","names":["#context"],"sources":["../../../src/lib/typescript/ts-morph.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport defu from \"defu\";\nimport {\n CompilerOptions,\n FileSystemHost,\n InMemoryFileSystemHost,\n Project,\n ProjectOptions,\n RuntimeDirEntry\n} from \"ts-morph\";\nimport type { Context } from \"../../types/context\";\n\nexport class VirtualFileSystemHost\n extends InMemoryFileSystemHost\n implements FileSystemHost\n{\n #context: Context;\n\n public constructor(context: Context) {\n super();\n\n this.#context = context;\n }\n\n public override deleteSync(path: string) {\n this.#context.fs.removeSync(path);\n }\n\n public override readDirSync(dirPath: string): RuntimeDirEntry[] {\n if (!this.#context.fs.isDirectorySync(dirPath)) {\n return [];\n }\n\n return this.#context.fs.listSync(dirPath).reduce((ret, entry) => {\n const fullPath = this.#context.fs.resolveSync(entry);\n if (fullPath) {\n ret.push({\n name: entry,\n isDirectory: this.#context.fs.isDirectorySync(fullPath),\n isFile: this.#context.fs.isFileSync(fullPath),\n isSymlink: false\n });\n }\n\n return ret;\n }, [] as RuntimeDirEntry[]);\n }\n\n public override async readFile(filePath: string) {\n if (!this.#context.fs.isFileSync(filePath)) {\n return \"\";\n }\n\n return (await this.#context.fs.read(filePath))!;\n }\n\n public override readFileSync(filePath: string) {\n if (!this.#context.fs.isFileSync(filePath)) {\n return \"\";\n }\n\n return this.#context.fs.readSync(filePath)!;\n }\n\n public override async writeFile(filePath: string, fileText: string) {\n return this.#context.fs.write(filePath, fileText);\n }\n\n public override writeFileSync(filePath: string, fileText: string) {\n this.#context.fs.writeSync(filePath, fileText);\n }\n\n public override async mkdir(dirPath: string) {\n await this.#context.fs.mkdir(dirPath);\n }\n\n public override mkdirSync(dirPath: string) {\n this.#context.fs.mkdirSync(dirPath);\n }\n\n public override async move(srcPath: string, destPath: string) {\n await this.#context.fs.move(srcPath, destPath);\n }\n\n public override moveSync(srcPath: string, destPath: string) {\n this.#context.fs.moveSync(srcPath, destPath);\n }\n\n public override async copy(srcPath: string, destPath: string) {\n await this.#context.fs.copy(srcPath, destPath);\n }\n\n public override copySync(srcPath: string, destPath: string) {\n this.#context.fs.copySync(srcPath, destPath);\n }\n\n public override async fileExists(filePath: string) {\n return this.#context.fs.isFile(filePath);\n }\n\n public override fileExistsSync(filePath: string) {\n return this.#context.fs.isFileSync(filePath);\n }\n\n public override async directoryExists(dirPath: string) {\n return this.#context.fs.isDirectory(dirPath);\n }\n\n public override directoryExistsSync(dirPath: string): boolean {\n return this.#context.fs.isDirectorySync(dirPath);\n }\n\n public override realpathSync(path: string) {\n return this.#context.fs.resolveSync(path) || path;\n }\n\n public override getCurrentDirectory() {\n return this.#context.config.cwd;\n }\n\n public override async glob(\n patterns: ReadonlyArray<string>\n ): Promise<string[]> {\n return this.#context.fs.glob(patterns as string[]);\n }\n\n public override globSync(patterns: ReadonlyArray<string>): string[] {\n return this.#context.fs.globSync(patterns as string[]);\n }\n}\n\n/**\n * Create a ts-morph {@link Project} instance used for type reflection and module manipulation during processing\n *\n * @param context - The Powerlines context\n * @returns A ts-morph {@link Project} instance\n */\nexport function createProgram(\n context: Context,\n override: Partial<ProjectOptions>\n): Project {\n context.debug(\n `Creating ts-morph Project instance with configuration from: ${\n context.tsconfig.tsconfigFilePath\n }.`\n );\n\n const project = new Project(\n defu(override ?? {}, {\n skipAddingFilesFromTsConfig: false,\n tsConfigFilePath: context.tsconfig.tsconfigFilePath,\n fileSystem: new VirtualFileSystemHost(context),\n compilerOptions: defu(context.tsconfig.options ?? {}, {\n lib: [\"lib.esnext.full.d.ts\"]\n }) as CompilerOptions\n })\n );\n\n return project;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig.d.cts","names":[],"sources":["../../../src/lib/typescript/tsconfig.ts"],"mappings":";;;;;;;iBAyCgB,kBAAA,yBACU,cAAA,GAAiB,cAAA,2BAAA,CAEzC,OAAA,EAAS,kBAAA,CAAmB,eAAA,EAAiB,cAAA;AAAA,iBAiJzB,kBAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;AAAA,iBA2CA,eAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;;;;;;;;;;iBA+GN,mBAAA,CACd,GAAA,UACA,IAAA,UACA,QAAA
|
|
1
|
+
{"version":3,"file":"tsconfig.d.cts","names":[],"sources":["../../../src/lib/typescript/tsconfig.ts"],"mappings":";;;;;;;iBAyCgB,kBAAA,yBACU,cAAA,GAAiB,cAAA,2BAAA,CAEzC,OAAA,EAAS,kBAAA,CAAmB,eAAA,EAAiB,cAAA;AAAA,iBAiJzB,kBAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;AAAA,iBA2CA,eAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;;;;;;;;;;iBA+GN,mBAAA,CACd,GAAA,UACA,IAAA,UACA,QAAA;;;;;;;;;AAxT4D;iBA2V9C,mBAAA,CACd,GAAA,UACA,IAAA,UACA,QAAA;;;;;;;;iBAuBc,SAAA,CACd,YAAA,WAAuB,MAAA,SACvB,KAAA,YAAiB,MAAA,YACjB,UAAA,uBACU,MAAA;;;;;;;;iBAkCI,gBAAA,CACd,YAAA,WAAuB,MAAA,SACvB,KAAA,YAAiB,MAAA,sBACP,MAAA;;;;;;;;iBAuCI,YAAA,CACd,YAAA,WAAuB,MAAA,SACvB,KAAA,YAAiB,MAAM;;;;;;AAjTI;AA2C7B;iBAkRgB,mBAAA,CACd,YAAA,EAAc,aAAA,EACd,KAAA,EAAO,aAAa;;;;;;;;;;;;iBAqBN,yBAAA,CACd,aAAA,UACA,WAAA,UACA,QAAA,WACA,WAAA,GAAa,QAAA,EACb,oBAAA,GAAuB,QAAA,EACvB,IAAA,GAAM,EAAA,CAAG,eAAA,GACR,sBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig.d.mts","names":[],"sources":["../../../src/lib/typescript/tsconfig.ts"],"mappings":";;;;;;;iBAyCgB,kBAAA,yBACU,cAAA,GAAiB,cAAA,2BAAA,CAEzC,OAAA,EAAS,kBAAA,CAAmB,eAAA,EAAiB,cAAA;AAAA,iBAiJzB,kBAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;AAAA,iBA2CA,eAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;;;;;;;;;;iBA+GN,mBAAA,CACd,GAAA,UACA,IAAA,UACA,QAAA
|
|
1
|
+
{"version":3,"file":"tsconfig.d.mts","names":[],"sources":["../../../src/lib/typescript/tsconfig.ts"],"mappings":";;;;;;;iBAyCgB,kBAAA,yBACU,cAAA,GAAiB,cAAA,2BAAA,CAEzC,OAAA,EAAS,kBAAA,CAAmB,eAAA,EAAiB,cAAA;AAAA,iBAiJzB,kBAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;AAAA,iBA2CA,eAAA,yBACI,cAAA,GAAiB,cAAA,6CAExB,kBAAA,CAAmB,eAAA,EAAiB,cAAA,IACnD,kBAAA,CAAmB,eAAA,EAAiB,cAAA,EAAA,CACtC,OAAA,EAAS,QAAA,GAAW,OAAA;;;;;;;;;;iBA+GN,mBAAA,CACd,GAAA,UACA,IAAA,UACA,QAAA;;;;;;;;;AAxT4D;iBA2V9C,mBAAA,CACd,GAAA,UACA,IAAA,UACA,QAAA;;;;;;;;iBAuBc,SAAA,CACd,YAAA,WAAuB,MAAA,SACvB,KAAA,YAAiB,MAAA,YACjB,UAAA,uBACU,MAAA;;;;;;;;iBAkCI,gBAAA,CACd,YAAA,WAAuB,MAAA,SACvB,KAAA,YAAiB,MAAA,sBACP,MAAA;;;;;;;;iBAuCI,YAAA,CACd,YAAA,WAAuB,MAAA,SACvB,KAAA,YAAiB,MAAM;;;;;;AAjTI;AA2C7B;iBAkRgB,mBAAA,CACd,YAAA,EAAc,aAAA,EACd,KAAA,EAAO,aAAa;;;;;;;;;;;;iBAqBN,yBAAA,CACd,aAAA,UACA,WAAA,UACA,QAAA,WACA,WAAA,GAAa,QAAA,EACb,oBAAA,GAAuB,QAAA,EACvB,IAAA,GAAM,EAAA,CAAG,eAAA,GACR,sBAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig.mjs","names":[],"sources":["../../../src/lib/typescript/tsconfig.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { Diff, ObjectData } from \"@donedeal0/superdiff\";\nimport { getObjectDiff } from \"@donedeal0/superdiff\";\nimport { existsSync } from \"@stryke/fs/exists\";\nimport { readJsonFile, readJsonFileSync } from \"@stryke/fs/json\";\nimport { isPackageExists } from \"@stryke/fs/package-fns\";\nimport { StormJSON } from \"@stryke/json/storm-json\";\nimport { appendPath } from \"@stryke/path/append\";\nimport {\n findFileName,\n findFilePath,\n relativePath\n} from \"@stryke/path/file-path-fns\";\nimport { joinPaths } from \"@stryke/path/join-paths\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { FilterPattern } from \"@stryke/types/file\";\nimport { TsConfigJson } from \"@stryke/types/tsconfig\";\nimport chalk from \"chalk\";\nimport defu from \"defu\";\nimport ts from \"typescript\";\nimport { ResolvedConfig } from \"../../types/config\";\nimport { EnvironmentContext } from \"../../types/context\";\nimport type { ParsedTypeScriptConfig, TSConfig } from \"../../types/tsconfig\";\n\nexport function getTsconfigDtsPath<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown\n>(context: EnvironmentContext<TResolvedConfig, TSystemContext>): string {\n const dtsRelativePath = joinPaths(\n relativePath(\n joinPaths(context.config.cwd, context.config.root),\n findFilePath(context.typesPath)\n ),\n findFileName(context.typesPath)\n );\n\n return dtsRelativePath;\n}\n\nasync function resolveTsconfigChanges<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown\n>(\n context: EnvironmentContext<TResolvedConfig, TSystemContext>\n): Promise<TsConfigJson> {\n const tsconfig = getParsedTypeScriptConfig(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig,\n context.config.tsconfigRaw\n );\n\n const tsconfigFilePath = getTsconfigFilePath(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig\n );\n\n const tsconfigJson = await readJsonFile<TsConfigJson>(tsconfigFilePath);\n tsconfigJson.compilerOptions ??= {};\n\n if (context.config.output.dts !== false) {\n const dtsRelativePath = getTsconfigDtsPath(context);\n\n if (\n !tsconfigJson.include?.some(filePattern =>\n isIncludeMatchFound(filePattern, [context.typesPath, dtsRelativePath])\n )\n ) {\n tsconfigJson.include ??= [];\n tsconfigJson.include.push(\n dtsRelativePath.startsWith(\"./\")\n ? dtsRelativePath.slice(2)\n : dtsRelativePath\n );\n }\n }\n\n if (\n !tsconfig.options.lib?.some(lib =>\n [\n \"lib.esnext.d.ts\",\n \"lib.es2021.d.ts\",\n \"lib.es2022.d.ts\",\n \"lib.es2023.d.ts\"\n ].includes(lib.toLowerCase())\n )\n ) {\n tsconfigJson.compilerOptions.lib ??= [];\n tsconfigJson.compilerOptions.lib.push(\"esnext\");\n }\n\n // if (tsconfig.options.module !== ts.ModuleKind.ESNext) {\n // tsconfigJson.compilerOptions.module = \"ESNext\";\n // }\n\n // if (\n // !tsconfig.options.target ||\n // ![\n // ts.ScriptTarget.ESNext,\n // ts.ScriptTarget.ES2024,\n // ts.ScriptTarget.ES2023,\n // ts.ScriptTarget.ES2022,\n // ts.ScriptTarget.ES2021\n // ].includes(tsconfig.options.target)\n // ) {\n // tsconfigJson.compilerOptions.target = \"ESNext\";\n // }\n\n // if (tsconfig.options.moduleResolution !== ts.ModuleResolutionKind.Bundler) {\n // tsconfigJson.compilerOptions.moduleResolution = \"Bundler\";\n // }\n\n // if (tsconfig.options.moduleDetection !== ts.ModuleDetectionKind.Force) {\n // tsconfigJson.compilerOptions.moduleDetection = \"force\";\n // }\n\n // if (tsconfig.options.allowSyntheticDefaultImports !== true) {\n // tsconfigJson.compilerOptions.allowSyntheticDefaultImports = true;\n // }\n\n // if (tsconfig.options.noImplicitOverride !== true) {\n // tsconfigJson.compilerOptions.noImplicitOverride = true;\n // }\n\n // if (tsconfig.options.noUncheckedIndexedAccess !== true) {\n // tsconfigJson.compilerOptions.noUncheckedIndexedAccess = true;\n // }\n\n // if (tsconfig.options.skipLibCheck !== true) {\n // tsconfigJson.compilerOptions.skipLibCheck = true;\n // }\n\n // if (tsconfig.options.resolveJsonModule !== true) {\n // tsconfigJson.compilerOptions.resolveJsonModule = true;\n // }\n\n // if (tsconfig.options.verbatimModuleSyntax !== false) {\n // tsconfigJson.compilerOptions.verbatimModuleSyntax = false;\n // }\n\n // if (tsconfig.options.allowJs !== true) {\n // tsconfigJson.compilerOptions.allowJs = true;\n // }\n\n // if (tsconfig.options.declaration !== true) {\n // tsconfigJson.compilerOptions.declaration = true;\n // }\n\n if (tsconfig.options.esModuleInterop !== true) {\n tsconfigJson.compilerOptions.esModuleInterop = true;\n }\n\n if (tsconfig.options.isolatedModules !== true) {\n tsconfigJson.compilerOptions.isolatedModules = true;\n }\n\n if (context.config.platform === \"node\") {\n if (\n !tsconfig.options.types?.some(\n type =>\n type.toLowerCase() === \"node\" || type.toLowerCase() === \"@types/node\"\n )\n ) {\n tsconfigJson.compilerOptions.types ??= [];\n tsconfigJson.compilerOptions.types.push(\"node\");\n }\n }\n\n return tsconfigJson;\n}\n\nexport async function initializeTsconfig<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown,\n TContext extends EnvironmentContext<TResolvedConfig, TSystemContext> =\n EnvironmentContext<TResolvedConfig, TSystemContext>\n>(context: TContext): Promise<void> {\n context.debug(\n \"Initializing TypeScript configuration (tsconfig.json) for the Powerlines project.\"\n );\n\n if (!isPackageExists(\"typescript\")) {\n throw new Error(\n 'The TypeScript package is not installed. Please install the package using the command: \"npm install typescript --save-dev\"'\n );\n }\n\n const tsconfigFilePath = getTsconfigFilePath(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig\n );\n\n context.tsconfig.originalTsconfigJson =\n await readJsonFile<TsConfigJson>(tsconfigFilePath);\n\n context.tsconfig.tsconfigJson = await resolveTsconfigChanges<\n TResolvedConfig,\n TSystemContext\n >(context);\n\n context.debug(\n \"Writing updated TypeScript configuration (tsconfig.json) file to disk.\"\n );\n\n await context.fs.write(\n tsconfigFilePath,\n StormJSON.stringify(context.tsconfig.tsconfigJson)\n );\n\n context.tsconfig = getParsedTypeScriptConfig(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig,\n context.config.tsconfigRaw,\n context.tsconfig.originalTsconfigJson\n );\n}\n\nexport async function resolveTsconfig<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown,\n TContext extends EnvironmentContext<TResolvedConfig, TSystemContext> =\n EnvironmentContext<TResolvedConfig, TSystemContext>\n>(context: TContext): Promise<void> {\n const updateTsconfigJson = await readJsonFile<TsConfigJson>(\n context.tsconfig.tsconfigFilePath\n );\n if (\n updateTsconfigJson?.compilerOptions?.types &&\n Array.isArray(updateTsconfigJson.compilerOptions.types) &&\n !updateTsconfigJson.compilerOptions.types.length\n ) {\n // If the types array is empty, we can safely remove it\n delete updateTsconfigJson.compilerOptions.types;\n }\n\n const result = getObjectDiff(\n context.tsconfig.originalTsconfigJson as NonNullable<ObjectData>,\n updateTsconfigJson as ObjectData,\n {\n ignoreArrayOrder: true,\n showOnly: {\n statuses: [\"added\", \"deleted\", \"updated\"],\n granularity: \"deep\"\n }\n }\n );\n\n const changes = [] as {\n field: string;\n status: \"added\" | \"deleted\" | \"updated\";\n previous: string;\n current: string;\n }[];\n const getChanges = (difference: Diff, property?: string) => {\n if (\n difference.status === \"added\" ||\n difference.status === \"deleted\" ||\n difference.status === \"updated\"\n ) {\n if (difference.diff) {\n for (const diff of difference.diff) {\n getChanges(\n diff,\n property\n ? `${property}.${difference.property}`\n : difference.property\n );\n }\n } else {\n changes.push({\n field: property\n ? `${property}.${difference.property}`\n : difference.property,\n status: difference.status,\n previous:\n difference.status === \"added\"\n ? \"---\"\n : StormJSON.stringify(difference.previousValue),\n current:\n difference.status === \"deleted\"\n ? \"---\"\n : StormJSON.stringify(difference.currentValue)\n });\n }\n }\n };\n\n for (const diff of result.diff) {\n getChanges(diff);\n }\n\n if (changes.length > 0) {\n context.warn(\n `Updating the following configuration values in \"${context.tsconfig.tsconfigFilePath}\" file:\n\n ${changes\n .map(\n (change, i) => `${chalk.bold.whiteBright(\n `${i + 1}. ${titleCase(change.status)} the ${change.field} field: `\n )}\n ${chalk.red(` - Previous: ${change.previous} `)}\n ${chalk.green(` - Updated: ${change.current} `)}\n `\n )\n .join(\"\\n\")}\n `\n );\n }\n\n await context.fs.write(\n context.tsconfig.tsconfigFilePath,\n StormJSON.stringify(updateTsconfigJson)\n );\n\n context.tsconfig = getParsedTypeScriptConfig(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig\n );\n if (!context.tsconfig) {\n throw new Error(\"Failed to parse the TypeScript configuration file.\");\n }\n}\n\n/**\n * Get the path to the tsconfig.json file.\n *\n * @param cwd - The root directory of the workspace.\n * @param root - The root directory of the project.\n * @param tsconfig - The path to the tsconfig.json file.\n * @returns The absolute path to the tsconfig.json file.\n * @throws If the tsconfig.json file does not exist.\n */\nexport function getTsconfigFilePath(\n cwd: string,\n root: string,\n tsconfig?: string\n): string {\n let tsconfigFilePath: string | undefined;\n if (tsconfig) {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, tsconfig);\n } else {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, \"tsconfig.app.json\");\n if (!tsconfigFilePath) {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, \"tsconfig.lib.json\");\n if (!tsconfigFilePath) {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, \"tsconfig.json\");\n }\n }\n }\n\n if (!tsconfigFilePath) {\n throw new Error(\n `Cannot find the \\`tsconfig.json\\` configuration file for the project at ${\n root\n }.`\n );\n }\n\n return tsconfigFilePath;\n}\n\n/**\n * Get the path to the tsconfig.json file.\n *\n * @param cwd - The root directory of the workspace.\n * @param root - The root directory of the project.\n * @param tsconfig - The path to the tsconfig.json file.\n * @returns The absolute path to the tsconfig.json file.\n * @throws If the tsconfig.json file does not exist.\n */\nexport function tryTsconfigFilePath(\n cwd: string,\n root: string,\n tsconfig: string\n): string | undefined {\n let tsconfigFilePath = tsconfig;\n if (!existsSync(tsconfigFilePath)) {\n tsconfigFilePath = appendPath(tsconfig, root);\n if (!existsSync(tsconfigFilePath)) {\n tsconfigFilePath = appendPath(tsconfig, appendPath(root, cwd));\n if (!existsSync(tsconfigFilePath)) {\n return undefined;\n }\n }\n }\n\n return tsconfigFilePath;\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function findMatch(\n tsconfigType: string | RegExp | null,\n types: (string | RegExp | null)[],\n extensions: string[] = [\".ts\", \".tsx\", \".d.ts\"]\n): string | RegExp | null | undefined {\n return types.find(\n type =>\n tsconfigType?.toString().toLowerCase() ===\n type?.toString().toLowerCase() ||\n tsconfigType?.toString().toLowerCase() ===\n `./${type?.toString().toLowerCase()}` ||\n `./${tsconfigType?.toString().toLowerCase()}` ===\n type?.toString().toLowerCase() ||\n extensions.some(\n ext =>\n `${tsconfigType?.toString().toLowerCase()}${ext}` ===\n type?.toString().toLowerCase() ||\n `${tsconfigType?.toString().toLowerCase()}${ext}` ===\n `./${type?.toString().toLowerCase()}` ||\n `${type?.toString().toLowerCase()}${ext}` ===\n `./${tsconfigType?.toString().toLowerCase()}` ||\n tsconfigType?.toString().toLowerCase() ===\n `${type?.toString().toLowerCase()}${ext}` ||\n tsconfigType?.toString().toLowerCase() ===\n `./${type?.toString().toLowerCase()}${ext}` ||\n type?.toString().toLowerCase() ===\n `./${tsconfigType?.toString().toLowerCase()}${ext}`\n )\n );\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function findIncludeMatch(\n tsconfigType: string | RegExp | null,\n types: (string | RegExp | null)[]\n): string | RegExp | null | undefined {\n return findMatch(tsconfigType, types, [\n \".ts\",\n \".tsx\",\n \".d.ts\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n \"/*.ts\",\n \"/*.tsx\",\n \"/*.d.ts\",\n \"/*.js\",\n \"/*.jsx\",\n \"/*.mjs\",\n \"/*.cjs\",\n \"/*.mts\",\n \"/*.cts\",\n \"/**/*.ts\",\n \"/**/*.tsx\",\n \"/**/*.d.ts\",\n \"/**/*.js\",\n \"/**/*.jsx\",\n \"/**/*.mjs\",\n \"/**/*.cjs\",\n \"/**/*.mts\",\n \"/**/*.cts\"\n ]);\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function isMatchFound(\n tsconfigType: string | RegExp | null,\n types: (string | RegExp | null)[]\n): boolean {\n return findMatch(tsconfigType, types) !== undefined;\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function isIncludeMatchFound(\n tsconfigType: FilterPattern,\n types: FilterPattern[]\n): boolean {\n return (\n findIncludeMatch(\n tsconfigType as string | RegExp | null,\n types as (string | RegExp | null)[]\n ) !== undefined\n );\n}\n\n/**\n * Get the parsed TypeScript configuration.\n *\n * @param workspaceRoot - The root directory of the workspace.\n * @param projectRoot - The root directory of the project.\n * @param tsconfig - The path to the tsconfig.json file.\n * @param tsconfigRaw - The raw tsconfig.json content.\n * @param originalTsconfigJson - The original tsconfig.json content.\n * @param host - The TypeScript parse config host.\n * @returns The resolved TypeScript configuration.\n */\nexport function getParsedTypeScriptConfig(\n workspaceRoot: string,\n projectRoot: string,\n tsconfig?: string,\n tsconfigRaw: TSConfig = {},\n originalTsconfigJson?: TSConfig,\n host: ts.ParseConfigHost = ts.sys\n): ParsedTypeScriptConfig {\n const tsconfigFilePath = getTsconfigFilePath(\n workspaceRoot,\n projectRoot,\n tsconfig\n );\n const tsconfigJson = readJsonFileSync<TSConfig>(tsconfigFilePath);\n if (!tsconfigJson) {\n throw new Error(\n `Cannot find the \\`tsconfig.json\\` configuration file at ${joinPaths(\n projectRoot,\n tsconfig ?? \"tsconfig.json\"\n )}`\n );\n }\n\n const parsedCommandLine = ts.parseJsonConfigFileContent(\n defu(tsconfigRaw ?? {}, tsconfigJson),\n host,\n appendPath(projectRoot, workspaceRoot)\n );\n if (parsedCommandLine.errors.length > 0) {\n const errorMessage = `Cannot parse the TypeScript compiler options. Please investigate the following issues:\n${parsedCommandLine.errors\n .map(\n error =>\n `- ${\n (error.category !== undefined && error.code\n ? `[${error.category}-${error.code}]: `\n : \"\") + error.messageText.toString()\n }`\n )\n .join(\"\\n\")}\n `;\n\n throw new Error(errorMessage);\n }\n\n return {\n ...parsedCommandLine,\n originalTsconfigJson: (originalTsconfigJson ??\n tsconfigJson) as TsConfigJson,\n tsconfigJson,\n tsconfigFilePath\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tsconfig.mjs","names":[],"sources":["../../../src/lib/typescript/tsconfig.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { Diff, ObjectData } from \"@donedeal0/superdiff\";\nimport { getObjectDiff } from \"@donedeal0/superdiff\";\nimport { existsSync } from \"@stryke/fs/exists\";\nimport { readJsonFile, readJsonFileSync } from \"@stryke/fs/json\";\nimport { isPackageExists } from \"@stryke/fs/package-fns\";\nimport { StormJSON } from \"@stryke/json/storm-json\";\nimport { appendPath } from \"@stryke/path/append\";\nimport {\n findFileName,\n findFilePath,\n relativePath\n} from \"@stryke/path/file-path-fns\";\nimport { joinPaths } from \"@stryke/path/join-paths\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { FilterPattern } from \"@stryke/types/file\";\nimport { TsConfigJson } from \"@stryke/types/tsconfig\";\nimport chalk from \"chalk\";\nimport defu from \"defu\";\nimport ts from \"typescript\";\nimport { ResolvedConfig } from \"../../types/config\";\nimport { EnvironmentContext } from \"../../types/context\";\nimport type { ParsedTypeScriptConfig, TSConfig } from \"../../types/tsconfig\";\n\nexport function getTsconfigDtsPath<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown\n>(context: EnvironmentContext<TResolvedConfig, TSystemContext>): string {\n const dtsRelativePath = joinPaths(\n relativePath(\n joinPaths(context.config.cwd, context.config.root),\n findFilePath(context.typesPath)\n ),\n findFileName(context.typesPath)\n );\n\n return dtsRelativePath;\n}\n\nasync function resolveTsconfigChanges<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown\n>(\n context: EnvironmentContext<TResolvedConfig, TSystemContext>\n): Promise<TsConfigJson> {\n const tsconfig = getParsedTypeScriptConfig(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig,\n context.config.tsconfigRaw\n );\n\n const tsconfigFilePath = getTsconfigFilePath(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig\n );\n\n const tsconfigJson = await readJsonFile<TsConfigJson>(tsconfigFilePath);\n tsconfigJson.compilerOptions ??= {};\n\n if (context.config.output.dts !== false) {\n const dtsRelativePath = getTsconfigDtsPath(context);\n\n if (\n !tsconfigJson.include?.some(filePattern =>\n isIncludeMatchFound(filePattern, [context.typesPath, dtsRelativePath])\n )\n ) {\n tsconfigJson.include ??= [];\n tsconfigJson.include.push(\n dtsRelativePath.startsWith(\"./\")\n ? dtsRelativePath.slice(2)\n : dtsRelativePath\n );\n }\n }\n\n if (\n !tsconfig.options.lib?.some(lib =>\n [\n \"lib.esnext.d.ts\",\n \"lib.es2021.d.ts\",\n \"lib.es2022.d.ts\",\n \"lib.es2023.d.ts\"\n ].includes(lib.toLowerCase())\n )\n ) {\n tsconfigJson.compilerOptions.lib ??= [];\n tsconfigJson.compilerOptions.lib.push(\"esnext\");\n }\n\n // if (tsconfig.options.module !== ts.ModuleKind.ESNext) {\n // tsconfigJson.compilerOptions.module = \"ESNext\";\n // }\n\n // if (\n // !tsconfig.options.target ||\n // ![\n // ts.ScriptTarget.ESNext,\n // ts.ScriptTarget.ES2024,\n // ts.ScriptTarget.ES2023,\n // ts.ScriptTarget.ES2022,\n // ts.ScriptTarget.ES2021\n // ].includes(tsconfig.options.target)\n // ) {\n // tsconfigJson.compilerOptions.target = \"ESNext\";\n // }\n\n // if (tsconfig.options.moduleResolution !== ts.ModuleResolutionKind.Bundler) {\n // tsconfigJson.compilerOptions.moduleResolution = \"Bundler\";\n // }\n\n // if (tsconfig.options.moduleDetection !== ts.ModuleDetectionKind.Force) {\n // tsconfigJson.compilerOptions.moduleDetection = \"force\";\n // }\n\n // if (tsconfig.options.allowSyntheticDefaultImports !== true) {\n // tsconfigJson.compilerOptions.allowSyntheticDefaultImports = true;\n // }\n\n // if (tsconfig.options.noImplicitOverride !== true) {\n // tsconfigJson.compilerOptions.noImplicitOverride = true;\n // }\n\n // if (tsconfig.options.noUncheckedIndexedAccess !== true) {\n // tsconfigJson.compilerOptions.noUncheckedIndexedAccess = true;\n // }\n\n // if (tsconfig.options.skipLibCheck !== true) {\n // tsconfigJson.compilerOptions.skipLibCheck = true;\n // }\n\n // if (tsconfig.options.resolveJsonModule !== true) {\n // tsconfigJson.compilerOptions.resolveJsonModule = true;\n // }\n\n // if (tsconfig.options.verbatimModuleSyntax !== false) {\n // tsconfigJson.compilerOptions.verbatimModuleSyntax = false;\n // }\n\n // if (tsconfig.options.allowJs !== true) {\n // tsconfigJson.compilerOptions.allowJs = true;\n // }\n\n // if (tsconfig.options.declaration !== true) {\n // tsconfigJson.compilerOptions.declaration = true;\n // }\n\n if (tsconfig.options.esModuleInterop !== true) {\n tsconfigJson.compilerOptions.esModuleInterop = true;\n }\n\n if (tsconfig.options.isolatedModules !== true) {\n tsconfigJson.compilerOptions.isolatedModules = true;\n }\n\n if (context.config.platform === \"node\") {\n if (\n !tsconfig.options.types?.some(\n type =>\n type.toLowerCase() === \"node\" || type.toLowerCase() === \"@types/node\"\n )\n ) {\n tsconfigJson.compilerOptions.types ??= [];\n tsconfigJson.compilerOptions.types.push(\"node\");\n }\n }\n\n return tsconfigJson;\n}\n\nexport async function initializeTsconfig<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown,\n TContext extends EnvironmentContext<TResolvedConfig, TSystemContext> =\n EnvironmentContext<TResolvedConfig, TSystemContext>\n>(context: TContext): Promise<void> {\n context.debug(\n \"Initializing TypeScript configuration (tsconfig.json) for the Powerlines project.\"\n );\n\n if (!isPackageExists(\"typescript\")) {\n throw new Error(\n 'The TypeScript package is not installed. Please install the package using the command: \"npm install typescript --save-dev\"'\n );\n }\n\n const tsconfigFilePath = getTsconfigFilePath(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig\n );\n\n context.tsconfig.originalTsconfigJson =\n await readJsonFile<TsConfigJson>(tsconfigFilePath);\n\n context.tsconfig.tsconfigJson = await resolveTsconfigChanges<\n TResolvedConfig,\n TSystemContext\n >(context);\n\n context.debug(\n \"Writing updated TypeScript configuration (tsconfig.json) file to disk.\"\n );\n\n await context.fs.write(\n tsconfigFilePath,\n StormJSON.stringify(context.tsconfig.tsconfigJson)\n );\n\n context.tsconfig = getParsedTypeScriptConfig(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig,\n context.config.tsconfigRaw,\n context.tsconfig.originalTsconfigJson\n );\n}\n\nexport async function resolveTsconfig<\n TResolvedConfig extends ResolvedConfig = ResolvedConfig,\n TSystemContext = unknown,\n TContext extends EnvironmentContext<TResolvedConfig, TSystemContext> =\n EnvironmentContext<TResolvedConfig, TSystemContext>\n>(context: TContext): Promise<void> {\n const updateTsconfigJson = await readJsonFile<TsConfigJson>(\n context.tsconfig.tsconfigFilePath\n );\n if (\n updateTsconfigJson?.compilerOptions?.types &&\n Array.isArray(updateTsconfigJson.compilerOptions.types) &&\n !updateTsconfigJson.compilerOptions.types.length\n ) {\n // If the types array is empty, we can safely remove it\n delete updateTsconfigJson.compilerOptions.types;\n }\n\n const result = getObjectDiff(\n context.tsconfig.originalTsconfigJson as NonNullable<ObjectData>,\n updateTsconfigJson as ObjectData,\n {\n ignoreArrayOrder: true,\n showOnly: {\n statuses: [\"added\", \"deleted\", \"updated\"],\n granularity: \"deep\"\n }\n }\n );\n\n const changes = [] as {\n field: string;\n status: \"added\" | \"deleted\" | \"updated\";\n previous: string;\n current: string;\n }[];\n const getChanges = (difference: Diff, property?: string) => {\n if (\n difference.status === \"added\" ||\n difference.status === \"deleted\" ||\n difference.status === \"updated\"\n ) {\n if (difference.diff) {\n for (const diff of difference.diff) {\n getChanges(\n diff,\n property\n ? `${property}.${difference.property}`\n : difference.property\n );\n }\n } else {\n changes.push({\n field: property\n ? `${property}.${difference.property}`\n : difference.property,\n status: difference.status,\n previous:\n difference.status === \"added\"\n ? \"---\"\n : StormJSON.stringify(difference.previousValue),\n current:\n difference.status === \"deleted\"\n ? \"---\"\n : StormJSON.stringify(difference.currentValue)\n });\n }\n }\n };\n\n for (const diff of result.diff) {\n getChanges(diff);\n }\n\n if (changes.length > 0) {\n context.warn(\n `Updating the following configuration values in \"${context.tsconfig.tsconfigFilePath}\" file:\n\n ${changes\n .map(\n (change, i) => `${chalk.bold.whiteBright(\n `${i + 1}. ${titleCase(change.status)} the ${change.field} field: `\n )}\n ${chalk.red(` - Previous: ${change.previous} `)}\n ${chalk.green(` - Updated: ${change.current} `)}\n `\n )\n .join(\"\\n\")}\n `\n );\n }\n\n await context.fs.write(\n context.tsconfig.tsconfigFilePath,\n StormJSON.stringify(updateTsconfigJson)\n );\n\n context.tsconfig = getParsedTypeScriptConfig(\n context.config.cwd,\n context.config.root,\n context.config.tsconfig\n );\n if (!context.tsconfig) {\n throw new Error(\"Failed to parse the TypeScript configuration file.\");\n }\n}\n\n/**\n * Get the path to the tsconfig.json file.\n *\n * @param cwd - The root directory of the workspace.\n * @param root - The root directory of the project.\n * @param tsconfig - The path to the tsconfig.json file.\n * @returns The absolute path to the tsconfig.json file.\n * @throws If the tsconfig.json file does not exist.\n */\nexport function getTsconfigFilePath(\n cwd: string,\n root: string,\n tsconfig?: string\n): string {\n let tsconfigFilePath: string | undefined;\n if (tsconfig) {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, tsconfig);\n } else {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, \"tsconfig.app.json\");\n if (!tsconfigFilePath) {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, \"tsconfig.lib.json\");\n if (!tsconfigFilePath) {\n tsconfigFilePath = tryTsconfigFilePath(cwd, root, \"tsconfig.json\");\n }\n }\n }\n\n if (!tsconfigFilePath) {\n throw new Error(\n `Cannot find the \\`tsconfig.json\\` configuration file for the project at ${\n root\n }.`\n );\n }\n\n return tsconfigFilePath;\n}\n\n/**\n * Get the path to the tsconfig.json file.\n *\n * @param cwd - The root directory of the workspace.\n * @param root - The root directory of the project.\n * @param tsconfig - The path to the tsconfig.json file.\n * @returns The absolute path to the tsconfig.json file.\n * @throws If the tsconfig.json file does not exist.\n */\nexport function tryTsconfigFilePath(\n cwd: string,\n root: string,\n tsconfig: string\n): string | undefined {\n let tsconfigFilePath = tsconfig;\n if (!existsSync(tsconfigFilePath)) {\n tsconfigFilePath = appendPath(tsconfig, root);\n if (!existsSync(tsconfigFilePath)) {\n tsconfigFilePath = appendPath(tsconfig, appendPath(root, cwd));\n if (!existsSync(tsconfigFilePath)) {\n return undefined;\n }\n }\n }\n\n return tsconfigFilePath;\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function findMatch(\n tsconfigType: string | RegExp | null,\n types: (string | RegExp | null)[],\n extensions: string[] = [\".ts\", \".tsx\", \".d.ts\"]\n): string | RegExp | null | undefined {\n return types.find(\n type =>\n tsconfigType?.toString().toLowerCase() ===\n type?.toString().toLowerCase() ||\n tsconfigType?.toString().toLowerCase() ===\n `./${type?.toString().toLowerCase()}` ||\n `./${tsconfigType?.toString().toLowerCase()}` ===\n type?.toString().toLowerCase() ||\n extensions.some(\n ext =>\n `${tsconfigType?.toString().toLowerCase()}${ext}` ===\n type?.toString().toLowerCase() ||\n `${tsconfigType?.toString().toLowerCase()}${ext}` ===\n `./${type?.toString().toLowerCase()}` ||\n `${type?.toString().toLowerCase()}${ext}` ===\n `./${tsconfigType?.toString().toLowerCase()}` ||\n tsconfigType?.toString().toLowerCase() ===\n `${type?.toString().toLowerCase()}${ext}` ||\n tsconfigType?.toString().toLowerCase() ===\n `./${type?.toString().toLowerCase()}${ext}` ||\n type?.toString().toLowerCase() ===\n `./${tsconfigType?.toString().toLowerCase()}${ext}`\n )\n );\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function findIncludeMatch(\n tsconfigType: string | RegExp | null,\n types: (string | RegExp | null)[]\n): string | RegExp | null | undefined {\n return findMatch(tsconfigType, types, [\n \".ts\",\n \".tsx\",\n \".d.ts\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n \"/*.ts\",\n \"/*.tsx\",\n \"/*.d.ts\",\n \"/*.js\",\n \"/*.jsx\",\n \"/*.mjs\",\n \"/*.cjs\",\n \"/*.mts\",\n \"/*.cts\",\n \"/**/*.ts\",\n \"/**/*.tsx\",\n \"/**/*.d.ts\",\n \"/**/*.js\",\n \"/**/*.jsx\",\n \"/**/*.mjs\",\n \"/**/*.cjs\",\n \"/**/*.mts\",\n \"/**/*.cts\"\n ]);\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function isMatchFound(\n tsconfigType: string | RegExp | null,\n types: (string | RegExp | null)[]\n): boolean {\n return findMatch(tsconfigType, types) !== undefined;\n}\n\n/**\n * Check if the TypeScript configuration type matches any of the provided types.\n *\n * @param tsconfigType - The type from the TypeScript configuration.\n * @param types - An array of type names to check against.\n * @returns True if the TypeScript configuration type matches any of the provided types, false otherwise.\n */\nexport function isIncludeMatchFound(\n tsconfigType: FilterPattern,\n types: FilterPattern[]\n): boolean {\n return (\n findIncludeMatch(\n tsconfigType as string | RegExp | null,\n types as (string | RegExp | null)[]\n ) !== undefined\n );\n}\n\n/**\n * Get the parsed TypeScript configuration.\n *\n * @param workspaceRoot - The root directory of the workspace.\n * @param projectRoot - The root directory of the project.\n * @param tsconfig - The path to the tsconfig.json file.\n * @param tsconfigRaw - The raw tsconfig.json content.\n * @param originalTsconfigJson - The original tsconfig.json content.\n * @param host - The TypeScript parse config host.\n * @returns The resolved TypeScript configuration.\n */\nexport function getParsedTypeScriptConfig(\n workspaceRoot: string,\n projectRoot: string,\n tsconfig?: string,\n tsconfigRaw: TSConfig = {},\n originalTsconfigJson?: TSConfig,\n host: ts.ParseConfigHost = ts.sys\n): ParsedTypeScriptConfig {\n const tsconfigFilePath = getTsconfigFilePath(\n workspaceRoot,\n projectRoot,\n tsconfig\n );\n const tsconfigJson = readJsonFileSync<TSConfig>(tsconfigFilePath);\n if (!tsconfigJson) {\n throw new Error(\n `Cannot find the \\`tsconfig.json\\` configuration file at ${joinPaths(\n projectRoot,\n tsconfig ?? \"tsconfig.json\"\n )}`\n );\n }\n\n const parsedCommandLine = ts.parseJsonConfigFileContent(\n defu(tsconfigRaw ?? {}, tsconfigJson),\n host,\n appendPath(projectRoot, workspaceRoot)\n );\n if (parsedCommandLine.errors.length > 0) {\n const errorMessage = `Cannot parse the TypeScript compiler options. Please investigate the following issues:\n${parsedCommandLine.errors\n .map(\n error =>\n `- ${\n (error.category !== undefined && error.code\n ? `[${error.category}-${error.code}]: `\n : \"\") + error.messageText.toString()\n }`\n )\n .join(\"\\n\")}\n `;\n\n throw new Error(errorMessage);\n }\n\n return {\n ...parsedCommandLine,\n originalTsconfigJson: (originalTsconfigJson ??\n tsconfigJson) as TsConfigJson,\n tsconfigJson,\n tsconfigFilePath\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.cts","names":[],"sources":["../../../src/lib/unplugin/helpers.ts"],"mappings":";;;;;;;AAgCA;;;;;iBAAgB,eAAA,mBACI,iBAAA,GAAoB,oBAAA,oBACpB,iBAAA,GAAoB,oBAAA,CAAA,CACtC,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,SAAA,GAAY,SAAA,GAAY,SAAA;;;;;;;iBAUzC,wBAAA,CACd,GAAA,YACC,GAAA,IAAO,
|
|
1
|
+
{"version":3,"file":"helpers.d.cts","names":[],"sources":["../../../src/lib/unplugin/helpers.ts"],"mappings":";;;;;;;AAgCA;;;;;iBAAgB,eAAA,mBACI,iBAAA,GAAoB,oBAAA,oBACpB,iBAAA,GAAoB,oBAAA,CAAA,CACtC,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,SAAA,GAAY,SAAA,GAAY,SAAA;;;;;;;iBAUzC,wBAAA,CACd,GAAA,YACC,GAAA,IAAO,sBAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.mts","names":[],"sources":["../../../src/lib/unplugin/helpers.ts"],"mappings":";;;;;;;AAgCA;;;;;iBAAgB,eAAA,mBACI,iBAAA,GAAoB,oBAAA,oBACpB,iBAAA,GAAoB,oBAAA,CAAA,CACtC,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,SAAA,GAAY,SAAA,GAAY,SAAA;;;;;;;iBAUzC,wBAAA,CACd,GAAA,YACC,GAAA,IAAO,
|
|
1
|
+
{"version":3,"file":"helpers.d.mts","names":[],"sources":["../../../src/lib/unplugin/helpers.ts"],"mappings":";;;;;;;AAgCA;;;;;iBAAgB,eAAA,mBACI,iBAAA,GAAoB,oBAAA,oBACpB,iBAAA,GAAoB,oBAAA,CAAA,CACtC,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,SAAA,GAAY,SAAA,GAAY,SAAA;;;;;;;iBAUzC,wBAAA,CACd,GAAA,YACC,GAAA,IAAO,sBAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":["defu"],"sources":["../../../src/lib/unplugin/helpers.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { defu } from \"defu\";\nimport type { UnpluginBuildContext } from \"unplugin\";\nimport { UNPLUGIN_BUILDER_VARIANTS } from \"../../constants/plugin\";\nimport type { UnresolvedContext } from \"../../types/context\";\nimport type { UnpluginBuilderVariant } from \"../../types/unplugin\";\n\n/**\n * Merges a base plugin context with an unplugin context, combining their properties.\n *\n * @param contextA - The base plugin context to merge into.\n * @param contextB - The unplugin context to merge from.\n * @returns The merged context.\n */\nexport function combineContexts<\n TContextA extends UnresolvedContext | UnpluginBuildContext,\n TContextB extends UnresolvedContext | UnpluginBuildContext\n>(contextA: TContextA, contextB: TContextB): TContextA & TContextB {\n return defu(contextA, contextB) as TContextA & TContextB;\n}\n\n/**\n * Checks if a value is a valid UnpluginBuilderVariant.\n *\n * @param str - The value to check.\n * @returns True if the value is a UnpluginBuilderVariant, false otherwise.\n */\nexport function isUnpluginBuilderVariant(\n str: unknown\n): str is UnpluginBuilderVariant {\n return (\n isSetString(str) &&\n UNPLUGIN_BUILDER_VARIANTS.includes(str as UnpluginBuilderVariant)\n );\n}\n"],"mappings":";;;;;;;;;;;;AAgCA,SAAgB,gBAGd,UAAqB,UAA4C;
|
|
1
|
+
{"version":3,"file":"helpers.mjs","names":["defu"],"sources":["../../../src/lib/unplugin/helpers.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { defu } from \"defu\";\nimport type { UnpluginBuildContext } from \"unplugin\";\nimport { UNPLUGIN_BUILDER_VARIANTS } from \"../../constants/plugin\";\nimport type { UnresolvedContext } from \"../../types/context\";\nimport type { UnpluginBuilderVariant } from \"../../types/unplugin\";\n\n/**\n * Merges a base plugin context with an unplugin context, combining their properties.\n *\n * @param contextA - The base plugin context to merge into.\n * @param contextB - The unplugin context to merge from.\n * @returns The merged context.\n */\nexport function combineContexts<\n TContextA extends UnresolvedContext | UnpluginBuildContext,\n TContextB extends UnresolvedContext | UnpluginBuildContext\n>(contextA: TContextA, contextB: TContextB): TContextA & TContextB {\n return defu(contextA, contextB) as TContextA & TContextB;\n}\n\n/**\n * Checks if a value is a valid UnpluginBuilderVariant.\n *\n * @param str - The value to check.\n * @returns True if the value is a UnpluginBuilderVariant, false otherwise.\n */\nexport function isUnpluginBuilderVariant(\n str: unknown\n): str is UnpluginBuilderVariant {\n return (\n isSetString(str) &&\n UNPLUGIN_BUILDER_VARIANTS.includes(str as UnpluginBuilderVariant)\n );\n}\n"],"mappings":";;;;;;;;;;;;AAgCA,SAAgB,gBAGd,UAAqB,UAA4C;CACjE,OAAOA,OAAK,UAAU,QAAQ;AAChC;;;;;;;AAQA,SAAgB,yBACd,KAC+B;CAC/B,OACE,YAAY,GAAG,KACf,0BAA0B,SAAS,GAA6B;AAEpE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-resolution.d.cts","names":[],"sources":["../../../src/lib/unplugin/module-resolution.ts"],"mappings":";;;;;UAmCiB,8CAAA;;AAAjB;;;;;;;;EAUE,MAAA;EAQkC;AAgBpC;;;;;EAhBE,SAAA,GAAY,
|
|
1
|
+
{"version":3,"file":"module-resolution.d.cts","names":[],"sources":["../../../src/lib/unplugin/module-resolution.ts"],"mappings":";;;;;UAmCiB,8CAAA;;AAAjB;;;;;;;;EAUE,MAAA;EAQkC;AAgBpC;;;;;EAhBE,SAAA,GAAY,OAAO,CAAC,cAAA;AAAA;;;;;;;;;;;;;AAqBC;iBALP,uCAAA,kBACG,iBAAA,CAAA,CAEjB,OAAA,EAAS,QAAA,EACT,OAAA,GAAS,8CAAA,GACR,IAAA,CAAK,eAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-resolution.d.mts","names":[],"sources":["../../../src/lib/unplugin/module-resolution.ts"],"mappings":";;;;;UAmCiB,8CAAA;;AAAjB;;;;;;;;EAUE,MAAA;EAQkC;AAgBpC;;;;;EAhBE,SAAA,GAAY,
|
|
1
|
+
{"version":3,"file":"module-resolution.d.mts","names":[],"sources":["../../../src/lib/unplugin/module-resolution.ts"],"mappings":";;;;;UAmCiB,8CAAA;;AAAjB;;;;;;;;EAUE,MAAA;EAQkC;AAgBpC;;;;;EAhBE,SAAA,GAAY,OAAO,CAAC,cAAA;AAAA;;;;;;;;;;;;;AAqBC;iBALP,uCAAA,kBACG,iBAAA,CAAA,CAEjB,OAAA,EAAS,QAAA,EACT,OAAA,GAAS,8CAAA,GACR,IAAA,CAAK,eAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-resolution.mjs","names":[],"sources":["../../../src/lib/unplugin/module-resolution.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport defu from \"defu\";\nimport { LoadResult } from \"rollup\";\nimport type {\n UnpluginBuildContext,\n UnpluginContext,\n UnpluginOptions\n} from \"unplugin\";\nimport {\n addVirtualPrefix,\n removeVirtualPrefix,\n VIRTUAL_MODULE_PREFIX_REGEX\n} from \"../../plugin-utils\";\nimport { ResolveResult, UnresolvedContext } from \"../../types/context\";\nimport { ResolveOptions } from \"../../types/fs\";\n\nexport interface CreateUnpluginModuleResolutionFunctionsOptions {\n /**\n * An indicator of whether to prefix virtual module IDs with a specific string. This is useful for ensuring that virtual modules are only processed by the plugin and not by other plugins or the bundler itself.\n *\n * @remarks\n * - If set to `true`, virtual module IDs will be prefixed with the string `__powerlines-virtual:`.\n * - If set to `false`, no prefix will be added to virtual module IDs.\n *\n * @defaultValue true\n */\n prefix?: boolean;\n\n /**\n * Optional overrides for the module resolution configuration.\n *\n * @remarks\n * This allows you to customize the behavior of the module resolution hooks by providing specific configuration options.\n */\n overrides?: Partial<ResolveOptions>;\n}\n\n/**\n * Creates the module resolution hook functions for a Powerlines unplugin plugin instance.\n *\n * @remarks\n * This includes the `resolveId` and `load` hooks.\n *\n * @see https://rollupjs.org/plugin-development/#resolveid\n * @see https://rollupjs.org/plugin-development/#load\n *\n * @param context - The plugin context.\n * @param options - Options for creating the module resolution functions.\n * @returns The module resolution hooks (`resolveId` and `load`).\n */\nexport function createUnpluginModuleResolutionFunctions<\n TContext extends UnresolvedContext\n>(\n context: TContext,\n options: CreateUnpluginModuleResolutionFunctionsOptions = {}\n): Pick<UnpluginOptions, \"resolveId\" | \"load\"> {\n return {\n async resolveId(\n this: UnpluginBuildContext & UnpluginContext,\n id: string,\n importer?: string,\n opts: {\n isEntry: boolean;\n } = { isEntry: false }\n ): Promise<string | ResolveResult | null | undefined> {\n const normalizedId = removeVirtualPrefix(id);\n const normalizedImporter = importer\n ? removeVirtualPrefix(importer)\n : undefined;\n\n let result = await context.callHook(\n \"resolveId\",\n {\n sequential: true,\n result: \"first\",\n order: \"pre\"\n },\n normalizedId,\n normalizedImporter,\n opts\n );\n if (isSetString(result)) {\n return result;\n } else if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n result = await context.callHook(\n \"resolveId\",\n {\n sequential: true,\n result: \"first\",\n order: \"normal\"\n },\n normalizedId,\n normalizedImporter,\n opts\n );\n if (isSetString(result)) {\n return result;\n } else if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n result = await context.resolve(\n normalizedId,\n normalizedImporter,\n defu(options.overrides ?? {}, {\n isFile: true,\n ...opts\n })\n );\n if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n result = await context.callHook(\n \"resolveId\",\n {\n sequential: true,\n result: \"first\",\n order: \"post\"\n },\n normalizedId,\n normalizedImporter,\n opts\n );\n if (isSetString(result)) {\n return result;\n } else if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n return null;\n },\n load: {\n filter:\n options.prefix !== false\n ? {\n id: VIRTUAL_MODULE_PREFIX_REGEX\n }\n : undefined,\n async handler(\n this: UnpluginBuildContext & UnpluginContext,\n id: string\n ): Promise<LoadResult | null | undefined> {\n const normalizedId = removeVirtualPrefix(id);\n\n let result = await context.callHook(\n \"load\",\n {\n sequential: true,\n result: \"first\",\n order: \"pre\"\n },\n normalizedId\n );\n if (result) {\n return result;\n }\n\n result = await context.callHook(\n \"load\",\n {\n sequential: true,\n result: \"first\",\n order: \"normal\"\n },\n normalizedId\n );\n if (result) {\n return result;\n }\n\n result = await context.load(normalizedId);\n if (result) {\n return result;\n }\n\n return context.callHook(\n \"load\",\n {\n sequential: true,\n result: \"first\",\n order: \"post\"\n },\n normalizedId\n );\n }\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqEA,SAAgB,wCAGd,SACA,UAA0D,
|
|
1
|
+
{"version":3,"file":"module-resolution.mjs","names":[],"sources":["../../../src/lib/unplugin/module-resolution.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport defu from \"defu\";\nimport { LoadResult } from \"rollup\";\nimport type {\n UnpluginBuildContext,\n UnpluginContext,\n UnpluginOptions\n} from \"unplugin\";\nimport {\n addVirtualPrefix,\n removeVirtualPrefix,\n VIRTUAL_MODULE_PREFIX_REGEX\n} from \"../../plugin-utils\";\nimport { ResolveResult, UnresolvedContext } from \"../../types/context\";\nimport { ResolveOptions } from \"../../types/fs\";\n\nexport interface CreateUnpluginModuleResolutionFunctionsOptions {\n /**\n * An indicator of whether to prefix virtual module IDs with a specific string. This is useful for ensuring that virtual modules are only processed by the plugin and not by other plugins or the bundler itself.\n *\n * @remarks\n * - If set to `true`, virtual module IDs will be prefixed with the string `__powerlines-virtual:`.\n * - If set to `false`, no prefix will be added to virtual module IDs.\n *\n * @defaultValue true\n */\n prefix?: boolean;\n\n /**\n * Optional overrides for the module resolution configuration.\n *\n * @remarks\n * This allows you to customize the behavior of the module resolution hooks by providing specific configuration options.\n */\n overrides?: Partial<ResolveOptions>;\n}\n\n/**\n * Creates the module resolution hook functions for a Powerlines unplugin plugin instance.\n *\n * @remarks\n * This includes the `resolveId` and `load` hooks.\n *\n * @see https://rollupjs.org/plugin-development/#resolveid\n * @see https://rollupjs.org/plugin-development/#load\n *\n * @param context - The plugin context.\n * @param options - Options for creating the module resolution functions.\n * @returns The module resolution hooks (`resolveId` and `load`).\n */\nexport function createUnpluginModuleResolutionFunctions<\n TContext extends UnresolvedContext\n>(\n context: TContext,\n options: CreateUnpluginModuleResolutionFunctionsOptions = {}\n): Pick<UnpluginOptions, \"resolveId\" | \"load\"> {\n return {\n async resolveId(\n this: UnpluginBuildContext & UnpluginContext,\n id: string,\n importer?: string,\n opts: {\n isEntry: boolean;\n } = { isEntry: false }\n ): Promise<string | ResolveResult | null | undefined> {\n const normalizedId = removeVirtualPrefix(id);\n const normalizedImporter = importer\n ? removeVirtualPrefix(importer)\n : undefined;\n\n let result = await context.callHook(\n \"resolveId\",\n {\n sequential: true,\n result: \"first\",\n order: \"pre\"\n },\n normalizedId,\n normalizedImporter,\n opts\n );\n if (isSetString(result)) {\n return result;\n } else if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n result = await context.callHook(\n \"resolveId\",\n {\n sequential: true,\n result: \"first\",\n order: \"normal\"\n },\n normalizedId,\n normalizedImporter,\n opts\n );\n if (isSetString(result)) {\n return result;\n } else if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n result = await context.resolve(\n normalizedId,\n normalizedImporter,\n defu(options.overrides ?? {}, {\n isFile: true,\n ...opts\n })\n );\n if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n result = await context.callHook(\n \"resolveId\",\n {\n sequential: true,\n result: \"first\",\n order: \"post\"\n },\n normalizedId,\n normalizedImporter,\n opts\n );\n if (isSetString(result)) {\n return result;\n } else if (isSetObject(result)) {\n return {\n ...result,\n id:\n result.virtual && options.prefix !== false\n ? addVirtualPrefix(result.id)\n : result.id\n };\n }\n\n return null;\n },\n load: {\n filter:\n options.prefix !== false\n ? {\n id: VIRTUAL_MODULE_PREFIX_REGEX\n }\n : undefined,\n async handler(\n this: UnpluginBuildContext & UnpluginContext,\n id: string\n ): Promise<LoadResult | null | undefined> {\n const normalizedId = removeVirtualPrefix(id);\n\n let result = await context.callHook(\n \"load\",\n {\n sequential: true,\n result: \"first\",\n order: \"pre\"\n },\n normalizedId\n );\n if (result) {\n return result;\n }\n\n result = await context.callHook(\n \"load\",\n {\n sequential: true,\n result: \"first\",\n order: \"normal\"\n },\n normalizedId\n );\n if (result) {\n return result;\n }\n\n result = await context.load(normalizedId);\n if (result) {\n return result;\n }\n\n return context.callHook(\n \"load\",\n {\n sequential: true,\n result: \"first\",\n order: \"post\"\n },\n normalizedId\n );\n }\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqEA,SAAgB,wCAGd,SACA,UAA0D,CAAC,GACd;CAC7C,OAAO;EACL,MAAM,UAEJ,IACA,UACA,OAEI,EAAE,SAAS,MAAM,GAC+B;GACpD,MAAM,eAAe,oBAAoB,EAAE;GAC3C,MAAM,qBAAqB,WACvB,oBAAoB,QAAQ,IAC5B;GAEJ,IAAI,SAAS,MAAM,QAAQ,SACzB,aACA;IACE,YAAY;IACZ,QAAQ;IACR,OAAO;GACT,GACA,cACA,oBACA,IACF;GACA,IAAI,YAAY,MAAM,GACpB,OAAO;QACF,IAAI,YAAY,MAAM,GAC3B,OAAO;IACL,GAAG;IACH,IACE,OAAO,WAAW,QAAQ,WAAW,QACjC,iBAAiB,OAAO,EAAE,IAC1B,OAAO;GACf;GAGF,SAAS,MAAM,QAAQ,SACrB,aACA;IACE,YAAY;IACZ,QAAQ;IACR,OAAO;GACT,GACA,cACA,oBACA,IACF;GACA,IAAI,YAAY,MAAM,GACpB,OAAO;QACF,IAAI,YAAY,MAAM,GAC3B,OAAO;IACL,GAAG;IACH,IACE,OAAO,WAAW,QAAQ,WAAW,QACjC,iBAAiB,OAAO,EAAE,IAC1B,OAAO;GACf;GAGF,SAAS,MAAM,QAAQ,QACrB,cACA,oBACA,KAAK,QAAQ,aAAa,CAAC,GAAG;IAC5B,QAAQ;IACR,GAAG;GACL,CAAC,CACH;GACA,IAAI,YAAY,MAAM,GACpB,OAAO;IACL,GAAG;IACH,IACE,OAAO,WAAW,QAAQ,WAAW,QACjC,iBAAiB,OAAO,EAAE,IAC1B,OAAO;GACf;GAGF,SAAS,MAAM,QAAQ,SACrB,aACA;IACE,YAAY;IACZ,QAAQ;IACR,OAAO;GACT,GACA,cACA,oBACA,IACF;GACA,IAAI,YAAY,MAAM,GACpB,OAAO;QACF,IAAI,YAAY,MAAM,GAC3B,OAAO;IACL,GAAG;IACH,IACE,OAAO,WAAW,QAAQ,WAAW,QACjC,iBAAiB,OAAO,EAAE,IAC1B,OAAO;GACf;GAGF,OAAO;EACT;EACA,MAAM;GACJ,QACE,QAAQ,WAAW,QACf,EACE,IAAI,4BACN,IACA;GACN,MAAM,QAEJ,IACwC;IACxC,MAAM,eAAe,oBAAoB,EAAE;IAE3C,IAAI,SAAS,MAAM,QAAQ,SACzB,QACA;KACE,YAAY;KACZ,QAAQ;KACR,OAAO;IACT,GACA,YACF;IACA,IAAI,QACF,OAAO;IAGT,SAAS,MAAM,QAAQ,SACrB,QACA;KACE,YAAY;KACZ,QAAQ;KACR,OAAO;IACT,GACA,YACF;IACA,IAAI,QACF,OAAO;IAGT,SAAS,MAAM,QAAQ,KAAK,YAAY;IACxC,IAAI,QACF,OAAO;IAGT,OAAO,QAAQ,SACb,QACA;KACE,YAAY;KACZ,QAAQ;KACR,OAAO;IACT,GACA,YACF;GACF;EACF;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.cts","names":[],"sources":["../../../src/lib/unplugin/plugin.ts"],"mappings":";;;;;UAoCiB,6BAAA,SAAsC,
|
|
1
|
+
{"version":3,"file":"plugin.d.cts","names":[],"sources":["../../../src/lib/unplugin/plugin.ts"],"mappings":";;;;;UAoCiB,6BAAA,SAAsC,8CAA8C;;AAArG;;;;;;;EASE,IAAA;EAOkB;AASpB;;;;EATE,kBAAA;AAAA;;;;;;;iBASc,sBAAA,kBAAwC,iBAAA,CAAA,CACtD,OAAA,EAAS,QAAA,EACT,OAAA,GAAS,6BAAA,SACF,eAAA,CAAgB,QAAA;AAAA,UA8BR,qBAAA,SAA8B,6BAA6B;;;;;AA9B3C;AA8BjC;iBAQgB,cAAA,kBAAgC,aAAA,GAAgB,aAAA,CAAA,CAC9D,OAAA,EAAS,QAAA,EACT,OAAA,GAAS,qBAAA,SACF,eAAA,CAAgB,QAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../src/lib/unplugin/plugin.ts"],"mappings":";;;;;UAoCiB,6BAAA,SAAsC,
|
|
1
|
+
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../src/lib/unplugin/plugin.ts"],"mappings":";;;;;UAoCiB,6BAAA,SAAsC,8CAA8C;;AAArG;;;;;;;EASE,IAAA;EAOkB;AASpB;;;;EATE,kBAAA;AAAA;;;;;;;iBASc,sBAAA,kBAAwC,iBAAA,CAAA,CACtD,OAAA,EAAS,QAAA,EACT,OAAA,GAAS,6BAAA,SACF,eAAA,CAAgB,QAAA;AAAA,UA8BR,qBAAA,SAA8B,6BAA6B;;;;;AA9B3C;AA8BjC;iBAQgB,cAAA,kBAAgC,aAAA,GAAgB,aAAA,CAAA,CAC9D,OAAA,EAAS,QAAA,EACT,OAAA,GAAS,qBAAA,SACF,eAAA,CAAgB,QAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../src/lib/unplugin/plugin.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { kebabCase } from \"@stryke/string-format/kebab-case\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport type {\n TransformResult,\n UnpluginBuildContext,\n UnpluginContext\n} from \"unplugin\";\nimport { setParseImpl } from \"unplugin\";\nimport { removeVirtualPrefix } from \"../../plugin-utils\";\nimport type { PluginContext, UnresolvedContext } from \"../../types/context\";\nimport type { UnpluginOptions } from \"../../types/unplugin\";\nimport { getString } from \"../utilities/source-file\";\nimport { combineContexts } from \"./helpers\";\nimport {\n createUnpluginModuleResolutionFunctions,\n CreateUnpluginModuleResolutionFunctionsOptions\n} from \"./module-resolution\";\n\nexport interface CreateUnpluginResolverOptions extends CreateUnpluginModuleResolutionFunctionsOptions {\n /**\n * A name to use for the unplugin instance. This is used for logging and to generate the plugin name. It does not affect the functionality of the plugin.\n *\n * @remarks\n * If not provided, the plugin will be named \"powerlines\". If provided, the plugin will be named `${name} - Powerlines` (e.g., \"MyPlugin - Powerlines\").\n *\n * @defaultValue \"powerlines\"\n */\n name?: string;\n\n /**\n * Whether to silence logging for the plugin hooks. This can be useful for plugins that run frequently or have hooks that are called often, to reduce noise in the logs. When set to `true`, the plugin will not log any messages for its hooks. When set to `false` (the default), the plugin will log messages for its hooks as normal.\n *\n * @defaultValue false\n */\n silenceHookLogging?: boolean;\n}\n\n/**\n * Creates a Powerlines unplugin instance.\n *\n * @param context - The plugin context.\n * @returns The unplugin instance.\n */\nexport function createUnpluginResolver<TContext extends UnresolvedContext>(\n context: TContext,\n options: CreateUnpluginResolverOptions = {}\n): () => UnpluginOptions<TContext> {\n setParseImpl(context.parse);\n\n const name = options.name || \"powerlines\";\n\n const logger = context.extendLogger(\n !options.silenceHookLogging && name !== \"powerlines\" ? { source: name } : {}\n );\n logger.debug(`Initializing ${titleCase(name)} plugin`);\n\n try {\n const { resolveId, load } =\n createUnpluginModuleResolutionFunctions<TContext>(context, options);\n\n return () => ({\n name:\n name.toLowerCase() === \"powerlines\"\n ? \"powerlines\"\n : `powerlines:${kebabCase(name)}`,\n context,\n resolveId,\n load\n });\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n\n throw error;\n }\n}\n\nexport interface CreateUnpluginOptions extends CreateUnpluginResolverOptions {}\n\n/**\n * Creates a Powerlines unplugin instance.\n *\n * @param context - The plugin context.\n * @returns The unplugin instance.\n */\nexport function createUnplugin<TContext extends PluginContext = PluginContext>(\n context: TContext,\n options: CreateUnpluginOptions = {}\n): () => UnpluginOptions<TContext> {\n setParseImpl(context.parse.bind(context));\n\n const name = options.name || \"powerlines\";\n\n const logger = context.extendLogger(\n !options.silenceHookLogging && name !== \"powerlines\" ? { source: name } : {}\n );\n logger.debug(`Initializing ${titleCase(name)} plugin`);\n\n try {\n const { resolveId, load } =\n createUnpluginModuleResolutionFunctions<TContext>(context, options);\n\n async function buildStart(this: UnpluginBuildContext) {\n if (!options.silenceHookLogging) {\n logger.debug(\"Powerlines build plugin starting...\");\n }\n\n await context.callHook(\"buildStart\", {\n sequential: true\n });\n }\n\n async function transform(\n this: UnpluginBuildContext & UnpluginContext,\n code: string,\n id: string\n ): Promise<TransformResult | null | undefined> {\n let transformed: TransformResult | string = code;\n\n for (const hook of context.environment.selectHooks(\"transform\")) {\n const result: TransformResult | string | undefined =\n await hook.handler.apply(combineContexts(context, this), [\n getString(transformed),\n removeVirtualPrefix(id)\n ] as [code: string, id: string]);\n if (result) {\n transformed = result;\n }\n }\n\n return transformed;\n }\n\n async function buildEnd(this: UnpluginBuildContext): Promise<void> {\n if (!options.silenceHookLogging) {\n logger.debug(\"Powerlines build plugin finishing...\");\n }\n\n return context.callHook(\"buildEnd\", {\n sequential: true\n });\n }\n\n async function writeBundle(): Promise<void> {\n if (!options.silenceHookLogging) {\n logger.debug(\"Finalizing Powerlines project output...\");\n }\n\n return context.callHook(\"writeBundle\", {\n sequential: true\n });\n }\n\n return () => ({\n name:\n name.toLowerCase() === \"powerlines\"\n ? \"powerlines\"\n : `powerlines:${kebabCase(name)}`,\n context,\n resolveId,\n load,\n transform,\n buildStart,\n buildEnd,\n writeBundle,\n vite: {\n sharedDuringBuild: true\n }\n });\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6DA,SAAgB,uBACd,SACA,UAAyC,
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../src/lib/unplugin/plugin.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { kebabCase } from \"@stryke/string-format/kebab-case\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport type {\n TransformResult,\n UnpluginBuildContext,\n UnpluginContext\n} from \"unplugin\";\nimport { setParseImpl } from \"unplugin\";\nimport { removeVirtualPrefix } from \"../../plugin-utils\";\nimport type { PluginContext, UnresolvedContext } from \"../../types/context\";\nimport type { UnpluginOptions } from \"../../types/unplugin\";\nimport { getString } from \"../utilities/source-file\";\nimport { combineContexts } from \"./helpers\";\nimport {\n createUnpluginModuleResolutionFunctions,\n CreateUnpluginModuleResolutionFunctionsOptions\n} from \"./module-resolution\";\n\nexport interface CreateUnpluginResolverOptions extends CreateUnpluginModuleResolutionFunctionsOptions {\n /**\n * A name to use for the unplugin instance. This is used for logging and to generate the plugin name. It does not affect the functionality of the plugin.\n *\n * @remarks\n * If not provided, the plugin will be named \"powerlines\". If provided, the plugin will be named `${name} - Powerlines` (e.g., \"MyPlugin - Powerlines\").\n *\n * @defaultValue \"powerlines\"\n */\n name?: string;\n\n /**\n * Whether to silence logging for the plugin hooks. This can be useful for plugins that run frequently or have hooks that are called often, to reduce noise in the logs. When set to `true`, the plugin will not log any messages for its hooks. When set to `false` (the default), the plugin will log messages for its hooks as normal.\n *\n * @defaultValue false\n */\n silenceHookLogging?: boolean;\n}\n\n/**\n * Creates a Powerlines unplugin instance.\n *\n * @param context - The plugin context.\n * @returns The unplugin instance.\n */\nexport function createUnpluginResolver<TContext extends UnresolvedContext>(\n context: TContext,\n options: CreateUnpluginResolverOptions = {}\n): () => UnpluginOptions<TContext> {\n setParseImpl(context.parse);\n\n const name = options.name || \"powerlines\";\n\n const logger = context.extendLogger(\n !options.silenceHookLogging && name !== \"powerlines\" ? { source: name } : {}\n );\n logger.debug(`Initializing ${titleCase(name)} plugin`);\n\n try {\n const { resolveId, load } =\n createUnpluginModuleResolutionFunctions<TContext>(context, options);\n\n return () => ({\n name:\n name.toLowerCase() === \"powerlines\"\n ? \"powerlines\"\n : `powerlines:${kebabCase(name)}`,\n context,\n resolveId,\n load\n });\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n\n throw error;\n }\n}\n\nexport interface CreateUnpluginOptions extends CreateUnpluginResolverOptions {}\n\n/**\n * Creates a Powerlines unplugin instance.\n *\n * @param context - The plugin context.\n * @returns The unplugin instance.\n */\nexport function createUnplugin<TContext extends PluginContext = PluginContext>(\n context: TContext,\n options: CreateUnpluginOptions = {}\n): () => UnpluginOptions<TContext> {\n setParseImpl(context.parse.bind(context));\n\n const name = options.name || \"powerlines\";\n\n const logger = context.extendLogger(\n !options.silenceHookLogging && name !== \"powerlines\" ? { source: name } : {}\n );\n logger.debug(`Initializing ${titleCase(name)} plugin`);\n\n try {\n const { resolveId, load } =\n createUnpluginModuleResolutionFunctions<TContext>(context, options);\n\n async function buildStart(this: UnpluginBuildContext) {\n if (!options.silenceHookLogging) {\n logger.debug(\"Powerlines build plugin starting...\");\n }\n\n await context.callHook(\"buildStart\", {\n sequential: true\n });\n }\n\n async function transform(\n this: UnpluginBuildContext & UnpluginContext,\n code: string,\n id: string\n ): Promise<TransformResult | null | undefined> {\n let transformed: TransformResult | string = code;\n\n for (const hook of context.environment.selectHooks(\"transform\")) {\n const result: TransformResult | string | undefined =\n await hook.handler.apply(combineContexts(context, this), [\n getString(transformed),\n removeVirtualPrefix(id)\n ] as [code: string, id: string]);\n if (result) {\n transformed = result;\n }\n }\n\n return transformed;\n }\n\n async function buildEnd(this: UnpluginBuildContext): Promise<void> {\n if (!options.silenceHookLogging) {\n logger.debug(\"Powerlines build plugin finishing...\");\n }\n\n return context.callHook(\"buildEnd\", {\n sequential: true\n });\n }\n\n async function writeBundle(): Promise<void> {\n if (!options.silenceHookLogging) {\n logger.debug(\"Finalizing Powerlines project output...\");\n }\n\n return context.callHook(\"writeBundle\", {\n sequential: true\n });\n }\n\n return () => ({\n name:\n name.toLowerCase() === \"powerlines\"\n ? \"powerlines\"\n : `powerlines:${kebabCase(name)}`,\n context,\n resolveId,\n load,\n transform,\n buildStart,\n buildEnd,\n writeBundle,\n vite: {\n sharedDuringBuild: true\n }\n });\n } catch (error) {\n logger.error(error instanceof Error ? error.message : String(error));\n\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6DA,SAAgB,uBACd,SACA,UAAyC,CAAC,GACT;CACjC,aAAa,QAAQ,KAAK;CAE1B,MAAM,OAAO,QAAQ,QAAQ;CAE7B,MAAM,SAAS,QAAQ,aACrB,CAAC,QAAQ,sBAAsB,SAAS,eAAe,EAAE,QAAQ,KAAK,IAAI,CAAC,CAC7E;CACA,OAAO,MAAM,gBAAgB,UAAU,IAAI,EAAE,QAAQ;CAErD,IAAI;EACF,MAAM,EAAE,WAAW,SACjB,wCAAkD,SAAS,OAAO;EAEpE,cAAc;GACZ,MACE,KAAK,YAAY,MAAM,eACnB,eACA,cAAc,UAAU,IAAI;GAClC;GACA;GACA;EACF;CACF,SAAS,OAAO;EACd,OAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;EAEnE,MAAM;CACR;AACF;;;;;;;AAUA,SAAgB,eACd,SACA,UAAiC,CAAC,GACD;CACjC,aAAa,QAAQ,MAAM,KAAK,OAAO,CAAC;CAExC,MAAM,OAAO,QAAQ,QAAQ;CAE7B,MAAM,SAAS,QAAQ,aACrB,CAAC,QAAQ,sBAAsB,SAAS,eAAe,EAAE,QAAQ,KAAK,IAAI,CAAC,CAC7E;CACA,OAAO,MAAM,gBAAgB,UAAU,IAAI,EAAE,QAAQ;CAErD,IAAI;EACF,MAAM,EAAE,WAAW,SACjB,wCAAkD,SAAS,OAAO;EAEpE,eAAe,aAAuC;GACpD,IAAI,CAAC,QAAQ,oBACX,OAAO,MAAM,qCAAqC;GAGpD,MAAM,QAAQ,SAAS,cAAc,EACnC,YAAY,KACd,CAAC;EACH;EAEA,eAAe,UAEb,MACA,IAC6C;GAC7C,IAAI,cAAwC;GAE5C,KAAK,MAAM,QAAQ,QAAQ,YAAY,YAAY,WAAW,GAAG;IAC/D,MAAM,SACJ,MAAM,KAAK,QAAQ,MAAM,gBAAgB,SAAS,IAAI,GAAG,CACvD,UAAU,WAAW,GACrB,oBAAoB,EAAE,CACxB,CAA+B;IACjC,IAAI,QACF,cAAc;GAElB;GAEA,OAAO;EACT;EAEA,eAAe,WAAoD;GACjE,IAAI,CAAC,QAAQ,oBACX,OAAO,MAAM,sCAAsC;GAGrD,OAAO,QAAQ,SAAS,YAAY,EAClC,YAAY,KACd,CAAC;EACH;EAEA,eAAe,cAA6B;GAC1C,IAAI,CAAC,QAAQ,oBACX,OAAO,MAAM,yCAAyC;GAGxD,OAAO,QAAQ,SAAS,eAAe,EACrC,YAAY,KACd,CAAC;EACH;EAEA,cAAc;GACZ,MACE,KAAK,YAAY,MAAM,eACnB,eACA,cAAc,UAAU,IAAI;GAClC;GACA;GACA;GACA;GACA;GACA;GACA;GACA,MAAM,EACJ,mBAAmB,KACrB;EACF;CACF,SAAS,OAAO;EACd,OAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;EAEnE,MAAM;CACR;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-header.d.cts","names":[],"sources":["../../../src/lib/utilities/file-header.ts"],"mappings":";;;UAqBiB,iBAAA;EACf,SAAA;EACA,
|
|
1
|
+
{"version":3,"file":"file-header.d.cts","names":[],"sources":["../../../src/lib/utilities/file-header.ts"],"mappings":";;;UAqBiB,iBAAA;EACf,SAAA;EACA,cAAc;AAAA;;;AAAA;AAUhB;;;;iBAAgB,wBAAA,CACd,SAAA,YACA,SAAwB;AAa1B;;;;AAAqD;AAcrD;AAdA,iBAAgB,oBAAA,CAAqB,OAAgB,EAAP,OAAO;;;;;;;AAcS;iBAA9C,aAAA,CAAc,OAAA,EAAS,OAAO,EAAE,OAAA;;;;;;;;iBAchC,uBAAA,CACd,OAAA,EAAS,OAAA,EACT,OAAA,GAAS,iBAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-header.d.mts","names":[],"sources":["../../../src/lib/utilities/file-header.ts"],"mappings":";;;UAqBiB,iBAAA;EACf,SAAA;EACA,
|
|
1
|
+
{"version":3,"file":"file-header.d.mts","names":[],"sources":["../../../src/lib/utilities/file-header.ts"],"mappings":";;;UAqBiB,iBAAA;EACf,SAAA;EACA,cAAc;AAAA;;;AAAA;AAUhB;;;;iBAAgB,wBAAA,CACd,SAAA,YACA,SAAwB;AAa1B;;;;AAAqD;AAcrD;AAdA,iBAAgB,oBAAA,CAAqB,OAAgB,EAAP,OAAO;;;;;;;AAcS;iBAA9C,aAAA,CAAc,OAAA,EAAS,OAAO,EAAE,OAAA;;;;;;;;iBAchC,uBAAA,CACd,OAAA,EAAS,OAAA,EACT,OAAA,GAAS,iBAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-header.mjs","names":[],"sources":["../../../src/lib/utilities/file-header.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { Context } from \"../../types/context\";\n\nexport interface FileHeaderOptions {\n directive?: string | null;\n prettierIgnore?: boolean;\n}\n\n/**\n * Generates a file header comment with a warning about automatic overwriting.\n *\n * @param overwrite - Whether the file will be automatically overwritten. If `false`, the warning will indicate that the file will not be overwritten. If `true` or omitted, the warning will indicate that the file will be overwritten.\n * @param framework - The name of the framework to include in the warning message. Defaults to \"powerlines\".\n * @returns A string containing the file header warning message.\n */\nexport function getFileHeaderWarningText(\n overwrite = true,\n framework = \"powerlines\"\n): string {\n return overwrite !== false\n ? `Do not edit this file manually - it will be overwritten automatically. Automatic overwrites can be disabled by using the \\`output.overwrite\\` option.`\n : `This file was generated on ${new Date().toLocaleString()} - it will not be overwritten by ${titleCase(framework)} while the \\`output.overwrite\\` option is set to \\`true\\`.`;\n}\n\n/**\n * Generates a file header warning message based on the provided context.\n *\n * @param context - The Powerlines context.\n * @returns A string containing the file header warning message.\n */\nexport function getFileHeaderWarning(context: Context): string {\n return getFileHeaderWarningText(\n context.config.output?.overwrite,\n context.config.framework?.name\n );\n}\n\n/**\n * Generates a file header comment for a generated source file, including a warning about automatic overwriting.\n *\n * @param context - The Powerlines context.\n * @param comment - The comment syntax to use for the header (e.g., `//` for JavaScript/TypeScript, `#` for Python). Defaults to `//`.\n * @returns A string containing the file header comment.\n */\nexport function getFileHeader(context: Context, comment = \"//\"): string {\n return `\n${comment} Generated by ${titleCase(context.config.framework?.name) || \"Powerlines\"}\n${comment} ${getFileHeaderWarning(context)}\n`;\n}\n\n/**\n * Generates a file header comment for a generated TypeScript source file, including a warning about automatic overwriting.\n *\n * @param context - The Powerlines context.\n * @param options - Additional options for generating the file header, such as a directive to include and whether to add a Prettier ignore comment.\n * @returns A string containing the file header comment for a TypeScript file.\n */\nexport function getTypescriptFileHeader(\n context: Context,\n options: FileHeaderOptions = {}\n): string {\n const { directive = null, prettierIgnore = false } = options;\n\n return `/* eslint-disable */\n// biome-ignore lint: disable\n${prettierIgnore ? `// prettier-ignore` : \"\"}${directive ? `\\n\\n${directive}\\n` : \"\\n\"}\n${getFileHeader(context)}\n\n`;\n}\n"],"mappings":";;;;;;;;;;AAiCA,SAAgB,yBACd,YAAY,MACZ,YAAY,cACJ;
|
|
1
|
+
{"version":3,"file":"file-header.mjs","names":[],"sources":["../../../src/lib/utilities/file-header.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { Context } from \"../../types/context\";\n\nexport interface FileHeaderOptions {\n directive?: string | null;\n prettierIgnore?: boolean;\n}\n\n/**\n * Generates a file header comment with a warning about automatic overwriting.\n *\n * @param overwrite - Whether the file will be automatically overwritten. If `false`, the warning will indicate that the file will not be overwritten. If `true` or omitted, the warning will indicate that the file will be overwritten.\n * @param framework - The name of the framework to include in the warning message. Defaults to \"powerlines\".\n * @returns A string containing the file header warning message.\n */\nexport function getFileHeaderWarningText(\n overwrite = true,\n framework = \"powerlines\"\n): string {\n return overwrite !== false\n ? `Do not edit this file manually - it will be overwritten automatically. Automatic overwrites can be disabled by using the \\`output.overwrite\\` option.`\n : `This file was generated on ${new Date().toLocaleString()} - it will not be overwritten by ${titleCase(framework)} while the \\`output.overwrite\\` option is set to \\`true\\`.`;\n}\n\n/**\n * Generates a file header warning message based on the provided context.\n *\n * @param context - The Powerlines context.\n * @returns A string containing the file header warning message.\n */\nexport function getFileHeaderWarning(context: Context): string {\n return getFileHeaderWarningText(\n context.config.output?.overwrite,\n context.config.framework?.name\n );\n}\n\n/**\n * Generates a file header comment for a generated source file, including a warning about automatic overwriting.\n *\n * @param context - The Powerlines context.\n * @param comment - The comment syntax to use for the header (e.g., `//` for JavaScript/TypeScript, `#` for Python). Defaults to `//`.\n * @returns A string containing the file header comment.\n */\nexport function getFileHeader(context: Context, comment = \"//\"): string {\n return `\n${comment} Generated by ${titleCase(context.config.framework?.name) || \"Powerlines\"}\n${comment} ${getFileHeaderWarning(context)}\n`;\n}\n\n/**\n * Generates a file header comment for a generated TypeScript source file, including a warning about automatic overwriting.\n *\n * @param context - The Powerlines context.\n * @param options - Additional options for generating the file header, such as a directive to include and whether to add a Prettier ignore comment.\n * @returns A string containing the file header comment for a TypeScript file.\n */\nexport function getTypescriptFileHeader(\n context: Context,\n options: FileHeaderOptions = {}\n): string {\n const { directive = null, prettierIgnore = false } = options;\n\n return `/* eslint-disable */\n// biome-ignore lint: disable\n${prettierIgnore ? `// prettier-ignore` : \"\"}${directive ? `\\n\\n${directive}\\n` : \"\\n\"}\n${getFileHeader(context)}\n\n`;\n}\n"],"mappings":";;;;;;;;;;AAiCA,SAAgB,yBACd,YAAY,MACZ,YAAY,cACJ;CACR,OAAO,cAAc,QACjB,0JACA,+CAA8B,IAAI,KAAK,GAAE,eAAe,EAAE,mCAAmC,UAAU,SAAS,EAAE;AACxH;;;;;;;AAQA,SAAgB,qBAAqB,SAA0B;CAC7D,OAAO,yBACL,QAAQ,OAAO,QAAQ,WACvB,QAAQ,OAAO,WAAW,IAC5B;AACF;;;;;;;;AASA,SAAgB,cAAc,SAAkB,UAAU,MAAc;CACtE,OAAO;EACP,QAAQ,gBAAgB,UAAU,QAAQ,OAAO,WAAW,IAAI,KAAK,aAAa;EAClF,QAAQ,GAAG,qBAAqB,OAAO,EAAE;;AAE3C;;;;;;;;AASA,SAAgB,wBACd,SACA,UAA6B,CAAC,GACtB;CACR,MAAM,EAAE,YAAY,MAAM,iBAAiB,UAAU;CAErD,OAAO;;EAEP,iBAAiB,uBAAuB,KAAK,YAAY,OAAO,UAAU,MAAM,KAAK;EACrF,cAAc,OAAO,EAAE;;;AAGzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.cts","names":[],"sources":["../../../src/lib/utilities/format.ts"],"mappings":";;;;;AAoCA;;;;;;;iBAAsB,MAAA,CACpB,OAAA,EAAS,OAAA,EACT,IAAA,UACA,IAAA,UACA,KAAA,aACC,
|
|
1
|
+
{"version":3,"file":"format.d.cts","names":[],"sources":["../../../src/lib/utilities/format.ts"],"mappings":";;;;;AAoCA;;;;;;;iBAAsB,MAAA,CACpB,OAAA,EAAS,OAAA,EACT,IAAA,UACA,IAAA,UACA,KAAA,aACC,OAAO;;;;AAAA;AAoDV;;;iBAAsB,YAAA,CAAa,OAAA,EAAS,OAAA,EAAS,IAAA,WAAY,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.mts","names":[],"sources":["../../../src/lib/utilities/format.ts"],"mappings":";;;;;AAoCA;;;;;;;iBAAsB,MAAA,CACpB,OAAA,EAAS,OAAA,EACT,IAAA,UACA,IAAA,UACA,KAAA,aACC,
|
|
1
|
+
{"version":3,"file":"format.d.mts","names":[],"sources":["../../../src/lib/utilities/format.ts"],"mappings":";;;;;AAoCA;;;;;;;iBAAsB,MAAA,CACpB,OAAA,EAAS,OAAA,EACT,IAAA,UACA,IAAA,UACA,KAAA,aACC,OAAO;;;;AAAA;AAoDV;;;iBAAsB,YAAA,CAAa,OAAA,EAAS,OAAA,EAAS,IAAA,WAAY,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.mjs","names":["prettier","defu"],"sources":["../../../src/lib/utilities/format.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { listFiles } from \"@stryke/fs/list-files\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { findFileExtension } from \"@stryke/path/file-path-fns\";\nimport { isParentPath } from \"@stryke/path/is-parent-path\";\nimport { defu } from \"defu\";\nimport { format as prettier, resolveConfig } from \"prettier\";\nimport importsPlugin from \"prettier-plugin-organize-imports\";\nimport { Context } from \"../../types/context\";\n\n/**\n * Formats code using Prettier based on the file path.\n *\n * @param context - The Powerlines context.\n * @param path - The file path to use for resolving Prettier configuration.\n * @param data - The code string to format.\n * @param force - Whether to force formatting even for output/build paths.\n * @returns A promise that resolves to the formatted code string.\n */\nexport async function format(\n context: Context,\n path: string,\n data: string,\n force = false\n): Promise<string> {\n if (\n !force &&\n ((context.config.output.copy &&\n isParentPath(\n path,\n appendPath(context.config.output.copy.path, context.config.cwd)\n )) ||\n isParentPath(\n path,\n appendPath(context.config.output.path, context.config.cwd)\n ))\n ) {\n return data;\n }\n\n let code = data;\n try {\n const resolvedConfig = await resolveConfig(path);\n if (resolvedConfig) {\n code = await prettier(\n data,\n defu(\n {\n absolutePath: path,\n ...resolvedConfig\n },\n findFileExtension(path) === \"ts\" || findFileExtension(path) === \"tsx\"\n ? { plugins: [importsPlugin] }\n : {}\n )\n );\n }\n } catch (error) {\n throw new Error(\n `Failed to format file at ${path} with Prettier: ${\n (error as Error).message\n }`,\n { cause: error }\n );\n }\n\n return code;\n}\n\n/**\n * Formats all files in a folder using Prettier based on their file paths.\n *\n * @param context - The Powerlines context.\n * @param path - The folder path containing files to format.\n * @returns A promise that resolves when all files have been formatted.\n */\nexport async function formatFolder(context: Context, path: string) {\n if (\n !context.config.output.copy ||\n (!isParentPath(\n path,\n appendPath(context.config.output.copy.path, context.config.cwd)\n ) &&\n !isParentPath(\n path,\n appendPath(context.config.output.path, context.config.cwd)\n ))\n ) {\n await Promise.allSettled(\n (await listFiles(path)).map(async file => {\n if (\n (!context.config.output.copy ||\n !isParentPath(\n file,\n appendPath(context.config.output.copy.path, context.config.cwd)\n )) &&\n !isParentPath(\n file,\n appendPath(context.config.output.path, context.config.cwd)\n )\n ) {\n const data = await context.fs.read(file);\n if (data) {\n const formatted = await format(context, file, data);\n\n return context.fs.write(file, formatted);\n }\n }\n })\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoCA,eAAsB,OACpB,SACA,MACA,MACA,QAAQ,OACS;
|
|
1
|
+
{"version":3,"file":"format.mjs","names":["prettier","defu"],"sources":["../../../src/lib/utilities/format.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { listFiles } from \"@stryke/fs/list-files\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { findFileExtension } from \"@stryke/path/file-path-fns\";\nimport { isParentPath } from \"@stryke/path/is-parent-path\";\nimport { defu } from \"defu\";\nimport { format as prettier, resolveConfig } from \"prettier\";\nimport importsPlugin from \"prettier-plugin-organize-imports\";\nimport { Context } from \"../../types/context\";\n\n/**\n * Formats code using Prettier based on the file path.\n *\n * @param context - The Powerlines context.\n * @param path - The file path to use for resolving Prettier configuration.\n * @param data - The code string to format.\n * @param force - Whether to force formatting even for output/build paths.\n * @returns A promise that resolves to the formatted code string.\n */\nexport async function format(\n context: Context,\n path: string,\n data: string,\n force = false\n): Promise<string> {\n if (\n !force &&\n ((context.config.output.copy &&\n isParentPath(\n path,\n appendPath(context.config.output.copy.path, context.config.cwd)\n )) ||\n isParentPath(\n path,\n appendPath(context.config.output.path, context.config.cwd)\n ))\n ) {\n return data;\n }\n\n let code = data;\n try {\n const resolvedConfig = await resolveConfig(path);\n if (resolvedConfig) {\n code = await prettier(\n data,\n defu(\n {\n absolutePath: path,\n ...resolvedConfig\n },\n findFileExtension(path) === \"ts\" || findFileExtension(path) === \"tsx\"\n ? { plugins: [importsPlugin] }\n : {}\n )\n );\n }\n } catch (error) {\n throw new Error(\n `Failed to format file at ${path} with Prettier: ${\n (error as Error).message\n }`,\n { cause: error }\n );\n }\n\n return code;\n}\n\n/**\n * Formats all files in a folder using Prettier based on their file paths.\n *\n * @param context - The Powerlines context.\n * @param path - The folder path containing files to format.\n * @returns A promise that resolves when all files have been formatted.\n */\nexport async function formatFolder(context: Context, path: string) {\n if (\n !context.config.output.copy ||\n (!isParentPath(\n path,\n appendPath(context.config.output.copy.path, context.config.cwd)\n ) &&\n !isParentPath(\n path,\n appendPath(context.config.output.path, context.config.cwd)\n ))\n ) {\n await Promise.allSettled(\n (await listFiles(path)).map(async file => {\n if (\n (!context.config.output.copy ||\n !isParentPath(\n file,\n appendPath(context.config.output.copy.path, context.config.cwd)\n )) &&\n !isParentPath(\n file,\n appendPath(context.config.output.path, context.config.cwd)\n )\n ) {\n const data = await context.fs.read(file);\n if (data) {\n const formatted = await format(context, file, data);\n\n return context.fs.write(file, formatted);\n }\n }\n })\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoCA,eAAsB,OACpB,SACA,MACA,MACA,QAAQ,OACS;CACjB,IACE,CAAC,UACC,QAAQ,OAAO,OAAO,QACtB,aACE,MACA,WAAW,QAAQ,OAAO,OAAO,KAAK,MAAM,QAAQ,OAAO,GAAG,CAChE,KACA,aACE,MACA,WAAW,QAAQ,OAAO,OAAO,MAAM,QAAQ,OAAO,GAAG,CAC3D,IAEF,OAAO;CAGT,IAAI,OAAO;CACX,IAAI;EACF,MAAM,iBAAiB,MAAM,cAAc,IAAI;EAC/C,IAAI,gBACF,OAAO,MAAMA,SACX,MACAC,OACE;GACE,cAAc;GACd,GAAG;EACL,GACA,kBAAkB,IAAI,MAAM,QAAQ,kBAAkB,IAAI,MAAM,QAC5D,EAAE,SAAS,CAAC,aAAa,EAAE,IAC3B,CAAC,CACP,CACF;CAEJ,SAAS,OAAO;EACd,MAAM,IAAI,MACR,4BAA4B,KAAK,kBAC9B,MAAgB,WAEnB,EAAE,OAAO,MAAM,CACjB;CACF;CAEA,OAAO;AACT;;;;;;;;AASA,eAAsB,aAAa,SAAkB,MAAc;CACjE,IACE,CAAC,QAAQ,OAAO,OAAO,QACtB,CAAC,aACA,MACA,WAAW,QAAQ,OAAO,OAAO,KAAK,MAAM,QAAQ,OAAO,GAAG,CAChE,KACE,CAAC,aACC,MACA,WAAW,QAAQ,OAAO,OAAO,MAAM,QAAQ,OAAO,GAAG,CAC3D,GAEF,MAAM,QAAQ,YACX,MAAM,UAAU,IAAI,GAAG,IAAI,OAAM,SAAQ;EACxC,KACG,CAAC,QAAQ,OAAO,OAAO,QACtB,CAAC,aACC,MACA,WAAW,QAAQ,OAAO,OAAO,KAAK,MAAM,QAAQ,OAAO,GAAG,CAChE,MACF,CAAC,aACC,MACA,WAAW,QAAQ,OAAO,OAAO,MAAM,QAAQ,OAAO,GAAG,CAC3D,GACA;GACA,MAAM,OAAO,MAAM,QAAQ,GAAG,KAAK,IAAI;GACvC,IAAI,MAAM;IACR,MAAM,YAAY,MAAM,OAAO,SAAS,MAAM,IAAI;IAElD,OAAO,QAAQ,GAAG,MAAM,MAAM,SAAS;GACzC;EACF;CACF,CAAC,CACH;AAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-file.d.cts","names":[],"sources":["../../../src/lib/utilities/source-file.ts"],"mappings":";;;;;;;AA+BA;;;;iBAAgB,SAAA,CACd,IAAA,WAAe,WAAA,GAAc,
|
|
1
|
+
{"version":3,"file":"source-file.d.cts","names":[],"sources":["../../../src/lib/utilities/source-file.ts"],"mappings":";;;;;;;AA+BA;;;;iBAAgB,SAAA,CACd,IAAA,WAAe,WAAA,GAAc,eAAe;;;;AAAA;AAuB9C;;iBAAgB,cAAA,CAAe,IAAA,WAAe,WAAA,GAAc,WAAW;;;;;;AAAA;AAevE;iBAAgB,aAAA,CACd,IAAA,WAAe,WAAA,EACf,EAAA,WACC,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-file.d.mts","names":[],"sources":["../../../src/lib/utilities/source-file.ts"],"mappings":";;;;;;;AA+BA;;;;iBAAgB,SAAA,CACd,IAAA,WAAe,WAAA,GAAc,
|
|
1
|
+
{"version":3,"file":"source-file.d.mts","names":[],"sources":["../../../src/lib/utilities/source-file.ts"],"mappings":";;;;;;;AA+BA;;;;iBAAgB,SAAA,CACd,IAAA,WAAe,WAAA,GAAc,eAAe;;;;AAAA;AAuB9C;;iBAAgB,cAAA,CAAe,IAAA,WAAe,WAAA,GAAc,WAAW;;;;;;AAAA;AAevE;iBAAgB,aAAA,CACd,IAAA,WAAe,WAAA,EACf,EAAA,WACC,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-file.mjs","names":[],"sources":["../../../src/lib/utilities/source-file.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { readFileIfExistingSync } from \"@stryke/fs/read-file\";\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isString } from \"@stryke/type-checks/is-string\";\nimport MagicString from \"magic-string\";\nimport { TransformResult } from \"unplugin\";\nimport { SourceFile } from \"../../types/context\";\n\n/**\n * Get the string from the source.\n *\n * @param code - The source string or magic string.\n * @returns The source string.\n */\nexport function getString(\n code: string | MagicString | TransformResult\n): string {\n if (!code) {\n return \"\";\n }\n\n if (isString(code)) {\n return code;\n }\n\n if (isSetObject(code) && \"code\" in code) {\n return code.code;\n }\n\n return code.toString();\n}\n\n/**\n * Get the magic string.\n *\n * @param code - The source string or magic string.\n * @returns The magic string.\n */\nexport function getMagicString(code: string | MagicString): MagicString {\n if (isString(code)) {\n return new MagicString(code);\n }\n\n return code;\n}\n\n/**\n * Get the source file.\n *\n * @param code - The source code.\n * @param id - The name of the file.\n * @returns The source file.\n */\nexport function getSourceFile(\n code: string | MagicString,\n id: string\n): SourceFile {\n const content = code ?? readFileIfExistingSync(id);\n\n return {\n id,\n code: getMagicString(content),\n env: []\n };\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,SAAgB,UACd,MACQ;
|
|
1
|
+
{"version":3,"file":"source-file.mjs","names":[],"sources":["../../../src/lib/utilities/source-file.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { readFileIfExistingSync } from \"@stryke/fs/read-file\";\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isString } from \"@stryke/type-checks/is-string\";\nimport MagicString from \"magic-string\";\nimport { TransformResult } from \"unplugin\";\nimport { SourceFile } from \"../../types/context\";\n\n/**\n * Get the string from the source.\n *\n * @param code - The source string or magic string.\n * @returns The source string.\n */\nexport function getString(\n code: string | MagicString | TransformResult\n): string {\n if (!code) {\n return \"\";\n }\n\n if (isString(code)) {\n return code;\n }\n\n if (isSetObject(code) && \"code\" in code) {\n return code.code;\n }\n\n return code.toString();\n}\n\n/**\n * Get the magic string.\n *\n * @param code - The source string or magic string.\n * @returns The magic string.\n */\nexport function getMagicString(code: string | MagicString): MagicString {\n if (isString(code)) {\n return new MagicString(code);\n }\n\n return code;\n}\n\n/**\n * Get the source file.\n *\n * @param code - The source code.\n * @param id - The name of the file.\n * @returns The source file.\n */\nexport function getSourceFile(\n code: string | MagicString,\n id: string\n): SourceFile {\n const content = code ?? readFileIfExistingSync(id);\n\n return {\n id,\n code: getMagicString(content),\n env: []\n };\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,SAAgB,UACd,MACQ;CACR,IAAI,CAAC,MACH,OAAO;CAGT,IAAI,SAAS,IAAI,GACf,OAAO;CAGT,IAAI,YAAY,IAAI,KAAK,UAAU,MACjC,OAAO,KAAK;CAGd,OAAO,KAAK,SAAS;AACvB;;;;;;;AAQA,SAAgB,eAAe,MAAyC;CACtE,IAAI,SAAS,IAAI,GACf,OAAO,IAAI,YAAY,IAAI;CAG7B,OAAO;AACT;;;;;;;;AASA,SAAgB,cACd,MACA,IACY;CAGZ,OAAO;EACL;EACA,MAAM,eAJQ,QAAQ,uBAAuB,EAAE,CAInB;EAC5B,KAAK,CAAC;CACR;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-map.d.cts","names":[],"sources":["../../../src/lib/utilities/source-map.ts"],"mappings":";;;;;;AAgCA;;;;;;iBAAgB,iBAAA,CACd,IAAA,EAAM,WAAA,EACN,EAAA,UACA,UAAA,YACC,
|
|
1
|
+
{"version":3,"file":"source-map.d.cts","names":[],"sources":["../../../src/lib/utilities/source-map.ts"],"mappings":";;;;;;AAgCA;;;;;;iBAAgB,iBAAA,CACd,IAAA,EAAM,WAAA,EACN,EAAA,UACA,UAAA,YACC,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-map.d.mts","names":[],"sources":["../../../src/lib/utilities/source-map.ts"],"mappings":";;;;;;AAgCA;;;;;;iBAAgB,iBAAA,CACd,IAAA,EAAM,WAAA,EACN,EAAA,UACA,UAAA,YACC,
|
|
1
|
+
{"version":3,"file":"source-map.d.mts","names":[],"sources":["../../../src/lib/utilities/source-map.ts"],"mappings":";;;;;;AAgCA;;;;;;iBAAgB,iBAAA,CACd,IAAA,EAAM,WAAA,EACN,EAAA,UACA,UAAA,YACC,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-map.mjs","names":[],"sources":["../../../src/lib/utilities/source-map.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport Diff from \"diff-match-patch\";\nimport type MagicString from \"magic-string\";\nimport type { TransformResult } from \"../../types/context\";\n\nconst dmp = new Diff();\n\n/**\n * Generate code with source map.\n *\n * @param code - The source code.\n * @param id - The file name.\n * @param transpiled - The transpiled code.\n * @returns The compiler result.\n */\nexport function generateSourceMap(\n code: MagicString,\n id: string,\n transpiled?: string\n): TransformResult | undefined {\n if (!transpiled) {\n return;\n }\n\n const diff = dmp.diff_main(code.toString(), transpiled);\n dmp.diff_cleanupSemantic(diff);\n\n let offset = 0;\n\n for (let index = 0; index < diff.length; index++) {\n if (diff[index]) {\n const [type, text] = diff[index]!;\n const textLength = text.length;\n\n switch (type) {\n case 0: {\n offset += textLength;\n break;\n }\n case 1: {\n code.prependLeft(offset, text);\n break;\n }\n case -1: {\n const next = diff.at(index + 1);\n\n if (next && next[0] === 1) {\n const replaceText = next[1];\n\n const firstNonWhitespaceIndexOfText = text.search(/\\S/);\n const offsetStart =\n offset + Math.max(firstNonWhitespaceIndexOfText, 0);\n\n code.update(offsetStart, offset + textLength, replaceText);\n index += 1;\n } else {\n code.remove(offset, offset + textLength);\n }\n\n offset += textLength;\n\n break;\n }\n }\n }\n }\n\n if (!code.hasChanged()) {\n return;\n }\n\n return {\n code: code.toString(),\n map: code.generateMap({\n source: id,\n file: `${id}.map`,\n includeContent: true\n })\n };\n}\n"],"mappings":";;;AAsBA,MAAM,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"source-map.mjs","names":[],"sources":["../../../src/lib/utilities/source-map.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport Diff from \"diff-match-patch\";\nimport type MagicString from \"magic-string\";\nimport type { TransformResult } from \"../../types/context\";\n\nconst dmp = new Diff();\n\n/**\n * Generate code with source map.\n *\n * @param code - The source code.\n * @param id - The file name.\n * @param transpiled - The transpiled code.\n * @returns The compiler result.\n */\nexport function generateSourceMap(\n code: MagicString,\n id: string,\n transpiled?: string\n): TransformResult | undefined {\n if (!transpiled) {\n return;\n }\n\n const diff = dmp.diff_main(code.toString(), transpiled);\n dmp.diff_cleanupSemantic(diff);\n\n let offset = 0;\n\n for (let index = 0; index < diff.length; index++) {\n if (diff[index]) {\n const [type, text] = diff[index]!;\n const textLength = text.length;\n\n switch (type) {\n case 0: {\n offset += textLength;\n break;\n }\n case 1: {\n code.prependLeft(offset, text);\n break;\n }\n case -1: {\n const next = diff.at(index + 1);\n\n if (next && next[0] === 1) {\n const replaceText = next[1];\n\n const firstNonWhitespaceIndexOfText = text.search(/\\S/);\n const offsetStart =\n offset + Math.max(firstNonWhitespaceIndexOfText, 0);\n\n code.update(offsetStart, offset + textLength, replaceText);\n index += 1;\n } else {\n code.remove(offset, offset + textLength);\n }\n\n offset += textLength;\n\n break;\n }\n }\n }\n }\n\n if (!code.hasChanged()) {\n return;\n }\n\n return {\n code: code.toString(),\n map: code.generateMap({\n source: id,\n file: `${id}.map`,\n includeContent: true\n })\n };\n}\n"],"mappings":";;;AAsBA,MAAM,MAAM,IAAI,KAAK;;;;;;;;;AAUrB,SAAgB,kBACd,MACA,IACA,YAC6B;CAC7B,IAAI,CAAC,YACH;CAGF,MAAM,OAAO,IAAI,UAAU,KAAK,SAAS,GAAG,UAAU;CACtD,IAAI,qBAAqB,IAAI;CAE7B,IAAI,SAAS;CAEb,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SACvC,IAAI,KAAK,QAAQ;EACf,MAAM,CAAC,MAAM,QAAQ,KAAK;EAC1B,MAAM,aAAa,KAAK;EAExB,QAAQ,MAAR;GACE,KAAK;IACH,UAAU;IACV;GAEF,KAAK;IACH,KAAK,YAAY,QAAQ,IAAI;IAC7B;GAEF,KAAK,IAAI;IACP,MAAM,OAAO,KAAK,GAAG,QAAQ,CAAC;IAE9B,IAAI,QAAQ,KAAK,OAAO,GAAG;KACzB,MAAM,cAAc,KAAK;KAEzB,MAAM,gCAAgC,KAAK,OAAO,IAAI;KACtD,MAAM,cACJ,SAAS,KAAK,IAAI,+BAA+B,CAAC;KAEpD,KAAK,OAAO,aAAa,SAAS,YAAY,WAAW;KACzD,SAAS;IACX,OACE,KAAK,OAAO,QAAQ,SAAS,UAAU;IAGzC,UAAU;IAEV;GACF;EACF;CACF;CAGF,IAAI,CAAC,KAAK,WAAW,GACnB;CAGF,OAAO;EACL,MAAM,KAAK,SAAS;EACpB,KAAK,KAAK,YAAY;GACpB,QAAQ;GACR,MAAM,GAAG,GAAG;GACZ,gBAAgB;EAClB,CAAC;CACH;AACF"}
|