semola 0.5.3 → 0.5.4
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/index-BhGNDjPq.d.mts +13 -0
- package/dist/index-DxSbeGP-.d.cts +13 -0
- package/dist/lib/api/index.cjs +522 -4
- package/dist/lib/api/index.d.cts +270 -4
- package/dist/lib/api/index.d.mts +270 -4
- package/dist/lib/api/index.mjs +520 -2
- package/dist/lib/cache/index.d.cts +16 -4
- package/dist/lib/cache/index.d.mts +16 -4
- package/dist/lib/cache/index.mjs +0 -2
- package/dist/lib/cron/index.cjs +734 -12
- package/dist/lib/cron/index.d.cts +145 -3
- package/dist/lib/cron/index.d.mts +145 -3
- package/dist/lib/cron/index.mjs +725 -3
- package/dist/lib/errors/index.d.cts +2 -13
- package/dist/lib/errors/index.d.mts +2 -13
- package/dist/lib/errors/index.mjs +0 -2
- package/dist/lib/i18n/index.d.cts +12 -4
- package/dist/lib/i18n/index.d.mts +12 -4
- package/dist/lib/i18n/index.mjs +0 -2
- package/dist/lib/logging/index.cjs +386 -17
- package/dist/lib/logging/index.d.cts +107 -6
- package/dist/lib/logging/index.d.mts +107 -6
- package/dist/lib/logging/index.mjs +373 -4
- package/dist/lib/policy/index.cjs +206 -20
- package/dist/lib/policy/index.d.cts +61 -5
- package/dist/lib/policy/index.d.mts +61 -5
- package/dist/lib/policy/index.mjs +187 -3
- package/dist/lib/prompts/index.cjs +374 -14
- package/dist/lib/prompts/index.d.cts +69 -4
- package/dist/lib/prompts/index.d.mts +69 -4
- package/dist/lib/prompts/index.mjs +362 -4
- package/dist/lib/pubsub/index.d.cts +9 -4
- package/dist/lib/pubsub/index.d.mts +9 -4
- package/dist/lib/pubsub/index.mjs +0 -2
- package/dist/lib/queue/index.d.cts +48 -6
- package/dist/lib/queue/index.d.mts +48 -6
- package/dist/lib/queue/index.mjs +0 -2
- package/dist/lib/workflow/index.d.cts +82 -4
- package/dist/lib/workflow/index.d.mts +82 -4
- package/dist/lib/workflow/index.mjs +0 -2
- package/package.json +1 -1
- package/dist/api/core/index.cjs +0 -206
- package/dist/api/core/index.d.cts +0 -21
- package/dist/api/core/index.d.cts.map +0 -1
- package/dist/api/core/index.d.mts +0 -21
- package/dist/api/core/index.d.mts.map +0 -1
- package/dist/api/core/index.mjs +0 -208
- package/dist/api/core/index.mjs.map +0 -1
- package/dist/api/core/types.d.cts +0 -107
- package/dist/api/core/types.d.cts.map +0 -1
- package/dist/api/core/types.d.mts +0 -107
- package/dist/api/core/types.d.mts.map +0 -1
- package/dist/api/middleware/index.cjs +0 -8
- package/dist/api/middleware/index.d.cts +0 -11
- package/dist/api/middleware/index.d.cts.map +0 -1
- package/dist/api/middleware/index.d.mts +0 -11
- package/dist/api/middleware/index.d.mts.map +0 -1
- package/dist/api/middleware/index.mjs +0 -10
- package/dist/api/middleware/index.mjs.map +0 -1
- package/dist/api/middleware/types.d.cts +0 -16
- package/dist/api/middleware/types.d.cts.map +0 -1
- package/dist/api/middleware/types.d.mts +0 -16
- package/dist/api/middleware/types.d.mts.map +0 -1
- package/dist/api/openapi/index.cjs +0 -254
- package/dist/api/openapi/index.mjs +0 -256
- package/dist/api/openapi/index.mjs.map +0 -1
- package/dist/api/openapi/types.d.cts +0 -60
- package/dist/api/openapi/types.d.cts.map +0 -1
- package/dist/api/openapi/types.d.mts +0 -60
- package/dist/api/openapi/types.d.mts.map +0 -1
- package/dist/api/validation/index.cjs +0 -64
- package/dist/api/validation/index.mjs +0 -61
- package/dist/api/validation/index.mjs.map +0 -1
- package/dist/cache/types.d.cts +0 -17
- package/dist/cache/types.d.cts.map +0 -1
- package/dist/cache/types.d.mts +0 -17
- package/dist/cache/types.d.mts.map +0 -1
- package/dist/cron/builder/index.cjs +0 -166
- package/dist/cron/builder/index.d.cts +0 -28
- package/dist/cron/builder/index.d.cts.map +0 -1
- package/dist/cron/builder/index.d.mts +0 -28
- package/dist/cron/builder/index.d.mts.map +0 -1
- package/dist/cron/builder/index.mjs +0 -163
- package/dist/cron/builder/index.mjs.map +0 -1
- package/dist/cron/builder/types.cjs +0 -27
- package/dist/cron/builder/types.d.cts +0 -79
- package/dist/cron/builder/types.d.cts.map +0 -1
- package/dist/cron/builder/types.d.mts +0 -79
- package/dist/cron/builder/types.d.mts.map +0 -1
- package/dist/cron/builder/types.mjs +0 -28
- package/dist/cron/builder/types.mjs.map +0 -1
- package/dist/cron/core/index.cjs +0 -308
- package/dist/cron/core/index.d.cts +0 -39
- package/dist/cron/core/index.d.cts.map +0 -1
- package/dist/cron/core/index.d.mts +0 -39
- package/dist/cron/core/index.d.mts.map +0 -1
- package/dist/cron/core/index.mjs +0 -310
- package/dist/cron/core/index.mjs.map +0 -1
- package/dist/cron/core/scanner.cjs +0 -237
- package/dist/cron/core/scanner.mjs +0 -238
- package/dist/cron/core/scanner.mjs.map +0 -1
- package/dist/cron/core/types.d.cts +0 -11
- package/dist/cron/core/types.d.cts.map +0 -1
- package/dist/cron/core/types.d.mts +0 -11
- package/dist/cron/core/types.d.mts.map +0 -1
- package/dist/errors/types.d.cts +0 -5
- package/dist/errors/types.d.cts.map +0 -1
- package/dist/errors/types.d.mts +0 -5
- package/dist/errors/types.d.mts.map +0 -1
- package/dist/i18n/types.d.cts +0 -13
- package/dist/i18n/types.d.cts.map +0 -1
- package/dist/i18n/types.d.mts +0 -13
- package/dist/i18n/types.d.mts.map +0 -1
- package/dist/lib/cache/index.d.cts.map +0 -1
- package/dist/lib/cache/index.d.mts.map +0 -1
- package/dist/lib/cache/index.mjs.map +0 -1
- package/dist/lib/errors/index.d.cts.map +0 -1
- package/dist/lib/errors/index.d.mts.map +0 -1
- package/dist/lib/errors/index.mjs.map +0 -1
- package/dist/lib/i18n/index.d.cts.map +0 -1
- package/dist/lib/i18n/index.d.mts.map +0 -1
- package/dist/lib/i18n/index.mjs.map +0 -1
- package/dist/lib/orm/index.cjs +0 -20
- package/dist/lib/orm/index.d.cts +0 -7
- package/dist/lib/orm/index.d.mts +0 -7
- package/dist/lib/orm/index.mjs +0 -6
- package/dist/lib/policy/index.d.cts.map +0 -1
- package/dist/lib/policy/index.d.mts.map +0 -1
- package/dist/lib/policy/index.mjs.map +0 -1
- package/dist/lib/prompts/index.d.cts.map +0 -1
- package/dist/lib/prompts/index.d.mts.map +0 -1
- package/dist/lib/prompts/index.mjs.map +0 -1
- package/dist/lib/pubsub/index.d.cts.map +0 -1
- package/dist/lib/pubsub/index.d.mts.map +0 -1
- package/dist/lib/pubsub/index.mjs.map +0 -1
- package/dist/lib/queue/index.d.cts.map +0 -1
- package/dist/lib/queue/index.d.mts.map +0 -1
- package/dist/lib/queue/index.mjs.map +0 -1
- package/dist/lib/workflow/index.d.cts.map +0 -1
- package/dist/lib/workflow/index.d.mts.map +0 -1
- package/dist/lib/workflow/index.mjs.map +0 -1
- package/dist/logging/core/index.cjs +0 -99
- package/dist/logging/core/index.d.cts +0 -26
- package/dist/logging/core/index.d.cts.map +0 -1
- package/dist/logging/core/index.d.mts +0 -26
- package/dist/logging/core/index.d.mts.map +0 -1
- package/dist/logging/core/index.mjs +0 -99
- package/dist/logging/core/index.mjs.map +0 -1
- package/dist/logging/core/types.cjs +0 -10
- package/dist/logging/core/types.d.cts +0 -22
- package/dist/logging/core/types.d.cts.map +0 -1
- package/dist/logging/core/types.d.mts +0 -22
- package/dist/logging/core/types.d.mts.map +0 -1
- package/dist/logging/core/types.mjs +0 -12
- package/dist/logging/core/types.mjs.map +0 -1
- package/dist/logging/formatter/index.cjs +0 -119
- package/dist/logging/formatter/index.d.cts +0 -27
- package/dist/logging/formatter/index.d.cts.map +0 -1
- package/dist/logging/formatter/index.d.mts +0 -27
- package/dist/logging/formatter/index.d.mts.map +0 -1
- package/dist/logging/formatter/index.mjs +0 -115
- package/dist/logging/formatter/index.mjs.map +0 -1
- package/dist/logging/formatter/types.d.cts +0 -5
- package/dist/logging/formatter/types.d.cts.map +0 -1
- package/dist/logging/formatter/types.d.mts +0 -5
- package/dist/logging/formatter/types.d.mts.map +0 -1
- package/dist/logging/provider/index.cjs +0 -165
- package/dist/logging/provider/index.d.cts +0 -28
- package/dist/logging/provider/index.d.cts.map +0 -1
- package/dist/logging/provider/index.d.mts +0 -28
- package/dist/logging/provider/index.d.mts.map +0 -1
- package/dist/logging/provider/index.mjs +0 -165
- package/dist/logging/provider/index.mjs.map +0 -1
- package/dist/logging/provider/types.d.cts +0 -23
- package/dist/logging/provider/types.d.cts.map +0 -1
- package/dist/logging/provider/types.d.mts +0 -23
- package/dist/logging/provider/types.d.mts.map +0 -1
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts +0 -80
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts.map +0 -1
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +0 -80
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts.map +0 -1
- package/dist/orm/column.cjs +0 -137
- package/dist/orm/column.d.cts +0 -121
- package/dist/orm/column.d.cts.map +0 -1
- package/dist/orm/column.d.mts +0 -121
- package/dist/orm/column.d.mts.map +0 -1
- package/dist/orm/column.mjs +0 -132
- package/dist/orm/column.mjs.map +0 -1
- package/dist/orm/dialect/index.cjs +0 -14
- package/dist/orm/dialect/index.mjs +0 -16
- package/dist/orm/dialect/index.mjs.map +0 -1
- package/dist/orm/dialect/mysql.cjs +0 -31
- package/dist/orm/dialect/mysql.mjs +0 -33
- package/dist/orm/dialect/mysql.mjs.map +0 -1
- package/dist/orm/dialect/postgres.cjs +0 -23
- package/dist/orm/dialect/postgres.mjs +0 -25
- package/dist/orm/dialect/postgres.mjs.map +0 -1
- package/dist/orm/dialect/sqlite.cjs +0 -31
- package/dist/orm/dialect/sqlite.mjs +0 -33
- package/dist/orm/dialect/sqlite.mjs.map +0 -1
- package/dist/orm/dialect/utils.cjs +0 -8
- package/dist/orm/dialect/utils.mjs +0 -10
- package/dist/orm/dialect/utils.mjs.map +0 -1
- package/dist/orm/internal/table-columns.cjs +0 -31
- package/dist/orm/internal/table-columns.mjs +0 -32
- package/dist/orm/internal/table-columns.mjs.map +0 -1
- package/dist/orm/internal/table-lookup.cjs +0 -35
- package/dist/orm/internal/table-lookup.mjs +0 -35
- package/dist/orm/internal/table-lookup.mjs.map +0 -1
- package/dist/orm/internal/table-relations.cjs +0 -28
- package/dist/orm/internal/table-relations.mjs +0 -29
- package/dist/orm/internal/table-relations.mjs.map +0 -1
- package/dist/orm/migration/config.cjs +0 -7
- package/dist/orm/migration/config.d.cts +0 -7
- package/dist/orm/migration/config.d.cts.map +0 -1
- package/dist/orm/migration/config.d.mts +0 -7
- package/dist/orm/migration/config.d.mts.map +0 -1
- package/dist/orm/migration/config.mjs +0 -8
- package/dist/orm/migration/config.mjs.map +0 -1
- package/dist/orm/migration/types.d.cts +0 -20
- package/dist/orm/migration/types.d.cts.map +0 -1
- package/dist/orm/migration/types.d.mts +0 -20
- package/dist/orm/migration/types.d.mts.map +0 -1
- package/dist/orm/orm.cjs +0 -41
- package/dist/orm/orm.d.cts +0 -18
- package/dist/orm/orm.d.cts.map +0 -1
- package/dist/orm/orm.d.mts +0 -18
- package/dist/orm/orm.d.mts.map +0 -1
- package/dist/orm/orm.mjs +0 -43
- package/dist/orm/orm.mjs.map +0 -1
- package/dist/orm/relation.cjs +0 -18
- package/dist/orm/relation.d.cts +0 -8
- package/dist/orm/relation.d.cts.map +0 -1
- package/dist/orm/relation.d.mts +0 -8
- package/dist/orm/relation.d.mts.map +0 -1
- package/dist/orm/relation.mjs +0 -19
- package/dist/orm/relation.mjs.map +0 -1
- package/dist/orm/runtime/builders/mutations.cjs +0 -29
- package/dist/orm/runtime/builders/mutations.mjs +0 -28
- package/dist/orm/runtime/builders/mutations.mjs.map +0 -1
- package/dist/orm/runtime/builders/select.cjs +0 -18
- package/dist/orm/runtime/builders/select.mjs +0 -19
- package/dist/orm/runtime/builders/select.mjs.map +0 -1
- package/dist/orm/runtime/client.cjs +0 -90
- package/dist/orm/runtime/client.mjs +0 -92
- package/dist/orm/runtime/client.mjs.map +0 -1
- package/dist/orm/runtime/context.cjs +0 -49
- package/dist/orm/runtime/context.mjs +0 -51
- package/dist/orm/runtime/context.mjs.map +0 -1
- package/dist/orm/runtime/dialect/index.cjs +0 -11
- package/dist/orm/runtime/dialect/index.mjs +0 -13
- package/dist/orm/runtime/dialect/index.mjs.map +0 -1
- package/dist/orm/runtime/dialect/mysql.cjs +0 -95
- package/dist/orm/runtime/dialect/mysql.mjs +0 -97
- package/dist/orm/runtime/dialect/mysql.mjs.map +0 -1
- package/dist/orm/runtime/dialect/postgres.cjs +0 -51
- package/dist/orm/runtime/dialect/postgres.mjs +0 -53
- package/dist/orm/runtime/dialect/postgres.mjs.map +0 -1
- package/dist/orm/runtime/dialect/sqlite.cjs +0 -4
- package/dist/orm/runtime/dialect/sqlite.mjs +0 -7
- package/dist/orm/runtime/dialect/sqlite.mjs.map +0 -1
- package/dist/orm/runtime/errors.cjs +0 -19
- package/dist/orm/runtime/errors.mjs +0 -21
- package/dist/orm/runtime/errors.mjs.map +0 -1
- package/dist/orm/runtime/hydrate/many.cjs +0 -46
- package/dist/orm/runtime/hydrate/many.mjs +0 -48
- package/dist/orm/runtime/hydrate/many.mjs.map +0 -1
- package/dist/orm/runtime/hydrate/one.cjs +0 -38
- package/dist/orm/runtime/hydrate/one.mjs +0 -40
- package/dist/orm/runtime/hydrate/one.mjs.map +0 -1
- package/dist/orm/runtime/hydrate.cjs +0 -49
- package/dist/orm/runtime/hydrate.mjs +0 -51
- package/dist/orm/runtime/hydrate.mjs.map +0 -1
- package/dist/orm/runtime/rows.cjs +0 -30
- package/dist/orm/runtime/rows.mjs +0 -31
- package/dist/orm/runtime/rows.mjs.map +0 -1
- package/dist/orm/runtime/utils.cjs +0 -27
- package/dist/orm/runtime/utils.mjs +0 -27
- package/dist/orm/runtime/utils.mjs.map +0 -1
- package/dist/orm/sql/parse-array.cjs +0 -64
- package/dist/orm/sql/parse-array.mjs +0 -66
- package/dist/orm/sql/parse-array.mjs.map +0 -1
- package/dist/orm/sql/plan/select.cjs +0 -36
- package/dist/orm/sql/plan/select.mjs +0 -38
- package/dist/orm/sql/plan/select.mjs.map +0 -1
- package/dist/orm/sql/plan/where/operators.cjs +0 -95
- package/dist/orm/sql/plan/where/operators.mjs +0 -97
- package/dist/orm/sql/plan/where/operators.mjs.map +0 -1
- package/dist/orm/sql/plan/where.cjs +0 -59
- package/dist/orm/sql/plan/where.mjs +0 -61
- package/dist/orm/sql/plan/where.mjs.map +0 -1
- package/dist/orm/sql/serialize/clauses.cjs +0 -36
- package/dist/orm/sql/serialize/clauses.mjs +0 -37
- package/dist/orm/sql/serialize/clauses.mjs.map +0 -1
- package/dist/orm/sql/serialize/joins.cjs +0 -31
- package/dist/orm/sql/serialize/joins.mjs +0 -33
- package/dist/orm/sql/serialize/joins.mjs.map +0 -1
- package/dist/orm/sql/serialize/values.cjs +0 -30
- package/dist/orm/sql/serialize/values.mjs +0 -32
- package/dist/orm/sql/serialize/values.mjs.map +0 -1
- package/dist/orm/sql/serialize/where/predicate.cjs +0 -73
- package/dist/orm/sql/serialize/where/predicate.mjs +0 -75
- package/dist/orm/sql/serialize/where/predicate.mjs.map +0 -1
- package/dist/orm/sql/serialize/where/tree.cjs +0 -26
- package/dist/orm/sql/serialize/where/tree.mjs +0 -28
- package/dist/orm/sql/serialize/where/tree.mjs.map +0 -1
- package/dist/orm/sql/serialize/where.cjs +0 -10
- package/dist/orm/sql/serialize/where.mjs +0 -12
- package/dist/orm/sql/serialize/where.mjs.map +0 -1
- package/dist/orm/sql/serialize.cjs +0 -24
- package/dist/orm/sql/serialize.mjs +0 -25
- package/dist/orm/sql/serialize.mjs.map +0 -1
- package/dist/orm/table.cjs +0 -12
- package/dist/orm/table.d.cts +0 -12
- package/dist/orm/table.d.cts.map +0 -1
- package/dist/orm/table.d.mts +0 -12
- package/dist/orm/table.d.mts.map +0 -1
- package/dist/orm/table.mjs +0 -14
- package/dist/orm/table.mjs.map +0 -1
- package/dist/orm/types.d.cts +0 -183
- package/dist/orm/types.d.cts.map +0 -1
- package/dist/orm/types.d.mts +0 -183
- package/dist/orm/types.d.mts.map +0 -1
- package/dist/policy/helpers.cjs +0 -206
- package/dist/policy/helpers.d.cts +0 -50
- package/dist/policy/helpers.d.cts.map +0 -1
- package/dist/policy/helpers.d.mts +0 -50
- package/dist/policy/helpers.d.mts.map +0 -1
- package/dist/policy/helpers.mjs +0 -190
- package/dist/policy/helpers.mjs.map +0 -1
- package/dist/policy/types.d.cts +0 -16
- package/dist/policy/types.d.cts.map +0 -1
- package/dist/policy/types.d.mts +0 -16
- package/dist/policy/types.d.mts.map +0 -1
- package/dist/prompts/core/keys.cjs +0 -165
- package/dist/prompts/core/keys.mjs +0 -167
- package/dist/prompts/core/keys.mjs.map +0 -1
- package/dist/prompts/core/runtime.cjs +0 -104
- package/dist/prompts/core/runtime.mjs +0 -106
- package/dist/prompts/core/runtime.mjs.map +0 -1
- package/dist/prompts/core/session.cjs +0 -98
- package/dist/prompts/core/session.mjs +0 -100
- package/dist/prompts/core/session.mjs.map +0 -1
- package/dist/prompts/core/types.d.cts +0 -21
- package/dist/prompts/core/types.d.cts.map +0 -1
- package/dist/prompts/core/types.d.mts +0 -21
- package/dist/prompts/core/types.d.mts.map +0 -1
- package/dist/prompts/types.d.cts +0 -52
- package/dist/prompts/types.d.cts.map +0 -1
- package/dist/prompts/types.d.mts +0 -52
- package/dist/prompts/types.d.mts.map +0 -1
- package/dist/pubsub/types.d.cts +0 -10
- package/dist/pubsub/types.d.cts.map +0 -1
- package/dist/pubsub/types.d.mts +0 -10
- package/dist/pubsub/types.d.mts.map +0 -1
- package/dist/queue/types.d.cts +0 -47
- package/dist/queue/types.d.cts.map +0 -1
- package/dist/queue/types.d.mts +0 -47
- package/dist/queue/types.d.mts.map +0 -1
- package/dist/workflow/types.d.cts +0 -83
- package/dist/workflow/types.d.cts.map +0 -1
- package/dist/workflow/types.d.mts +0 -83
- package/dist/workflow/types.d.mts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../src/lib/policy/helpers.ts"],"sourcesContent":["const _brand = Symbol(\"conditionHelper\");\n\nexport type ConditionHelper<V> = {\n readonly [_brand]: (actual: V) => boolean;\n operator: string;\n value: unknown;\n fn: (actual: V) => boolean;\n};\n\nexport const eq = <V>(value: V): ConditionHelper<V> => {\n const fn = (actual: V) => actual === value;\n\n return {\n [_brand]: fn,\n operator: \"eq\",\n value,\n fn,\n };\n};\n\nexport const neq = <V>(value: V): ConditionHelper<V> => {\n const fn = (actual: V) => actual !== value;\n\n return {\n [_brand]: fn,\n operator: \"neq\",\n value,\n fn,\n };\n};\n\nexport const gt: {\n (value: Date): ConditionHelper<Date>;\n (value: number): ConditionHelper<number>;\n (value: string): ConditionHelper<string>;\n} = (\n value: string | number | Date,\n): ConditionHelper<string | number | Date> => {\n const fn = (actual: string | number | Date) => actual > value;\n\n return {\n [_brand]: fn,\n operator: \"gt\",\n value,\n fn,\n };\n};\n\nexport const gte: {\n (value: Date): ConditionHelper<Date>;\n (value: number): ConditionHelper<number>;\n (value: string): ConditionHelper<string>;\n} = (\n value: string | number | Date,\n): ConditionHelper<string | number | Date> => {\n const fn = (actual: string | number | Date) => actual >= value;\n\n return {\n [_brand]: fn,\n operator: \"gte\",\n value,\n fn,\n };\n};\n\nexport const lt: {\n (value: Date): ConditionHelper<Date>;\n (value: number): ConditionHelper<number>;\n (value: string): ConditionHelper<string>;\n} = (\n value: string | number | Date,\n): ConditionHelper<string | number | Date> => {\n const fn = (actual: string | number | Date) => actual < value;\n\n return {\n [_brand]: fn,\n operator: \"lt\",\n value,\n fn,\n };\n};\n\nexport const lte: {\n (value: Date): ConditionHelper<Date>;\n (value: number): ConditionHelper<number>;\n (value: string): ConditionHelper<string>;\n} = (\n value: string | number | Date,\n): ConditionHelper<string | number | Date> => {\n const fn = (actual: string | number | Date) => actual <= value;\n\n return {\n [_brand]: fn,\n operator: \"lte\",\n value,\n fn,\n };\n};\n\nexport const not = <V>(inner: ConditionHelper<V>): ConditionHelper<V> => {\n const fn = (actual: V) => !inner.fn(actual);\n\n return {\n [_brand]: fn,\n operator: \"not\",\n value: inner,\n fn,\n };\n};\n\nexport const and = <V>(\n ...helpers: ConditionHelper<V>[]\n): ConditionHelper<V> => {\n const fn = (actual: V) => helpers.every((h) => h.fn(actual));\n\n return {\n [_brand]: fn,\n operator: \"and\",\n value: helpers,\n fn,\n };\n};\n\nexport const or = <V>(...helpers: ConditionHelper<V>[]): ConditionHelper<V> => {\n const fn = (actual: V) => helpers.some((h) => h.fn(actual));\n\n return {\n [_brand]: fn,\n operator: \"or\",\n value: helpers,\n fn,\n };\n};\n\nexport const startsWith = (prefix: string): ConditionHelper<string> => {\n const fn = (actual: string) => actual.startsWith(prefix);\n\n return {\n [_brand]: fn,\n operator: \"startsWith\",\n value: prefix,\n fn,\n };\n};\n\nexport const endsWith = (suffix: string): ConditionHelper<string> => {\n const fn = (actual: string) => actual.endsWith(suffix);\n\n return {\n [_brand]: fn,\n operator: \"endsWith\",\n value: suffix,\n fn,\n };\n};\n\nexport const includes = (substring: string): ConditionHelper<string> => {\n const fn = (actual: string) => actual.includes(substring);\n\n return {\n [_brand]: fn,\n operator: \"includes\",\n value: substring,\n fn,\n };\n};\n\nexport const matches = (pattern: RegExp): ConditionHelper<string> => {\n const fn = (actual: string) => {\n pattern.lastIndex = 0;\n\n return pattern.test(actual);\n };\n\n return {\n [_brand]: fn,\n operator: \"matches\",\n value: pattern,\n fn,\n };\n};\n\nexport const has = <V>(items: V | V[]): ConditionHelper<V[]> => {\n const fn = (actual: V[]) => {\n if (Array.isArray(items)) {\n return items.every((item) => actual.includes(item));\n }\n\n return actual.includes(items);\n };\n\n return {\n [_brand]: fn,\n operator: \"has\",\n value: items,\n fn,\n };\n};\n\nexport const hasAny = <V>(items: V | V[]): ConditionHelper<V[]> => {\n const normalized = Array.isArray(items) ? items : [items];\n const fn = (actual: V[]) => normalized.some((item) => actual.includes(item));\n\n return {\n [_brand]: fn,\n operator: \"hasAny\",\n value: items,\n fn,\n };\n};\n\ntype HasLengthArg = number | { min?: number; max?: number };\n\nexport const hasLength = (\n length: HasLengthArg,\n): ConditionHelper<string | unknown[]> => {\n const fn = (actual: string | unknown[]) => {\n const len = actual.length;\n\n if (typeof length === \"number\") {\n return len === length;\n }\n\n if (length.min !== undefined && len < length.min) {\n return false;\n }\n\n if (length.max !== undefined && len > length.max) {\n return false;\n }\n\n return true;\n };\n\n return {\n [_brand]: fn,\n operator: \"hasLength\",\n value: length,\n fn,\n };\n};\n\nexport const isEmpty = (): ConditionHelper<string | unknown[]> => {\n const fn = (actual: string | unknown[]) => actual.length === 0;\n\n return {\n [_brand]: fn,\n operator: \"isEmpty\",\n value: undefined,\n fn,\n };\n};\n\nexport const isDefined = (): ConditionHelper<unknown> => {\n const fn = (actual: unknown) => actual !== null && actual !== undefined;\n\n return {\n [_brand]: fn,\n operator: \"isDefined\",\n value: undefined,\n fn,\n };\n};\n\nexport const isNullish = (): ConditionHelper<unknown> => {\n const fn = (actual: unknown) => actual === null || actual === undefined;\n\n return {\n [_brand]: fn,\n operator: \"isNullish\",\n value: undefined,\n fn,\n };\n};\n"],"mappings":"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"}
|
package/dist/policy/types.d.cts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ConditionHelper } from "./helpers.cjs";
|
|
2
|
-
|
|
3
|
-
//#region src/lib/policy/types.d.ts
|
|
4
|
-
type Action = "read" | "create" | "update" | "delete" | (string & {});
|
|
5
|
-
type ConditionValue<V> = V extends Record<string, unknown> ? ConditionHelper<V> | Conditions<V> : ConditionHelper<V>;
|
|
6
|
-
type Conditions<T = Record<string, unknown>> = { [K in keyof T]?: ConditionValue<T[K]> };
|
|
7
|
-
type PolicyRuleParams<T = Record<string, unknown>> = {
|
|
8
|
-
action: Action | Action[];
|
|
9
|
-
conditions?: Conditions<T>;
|
|
10
|
-
reason?: string;
|
|
11
|
-
};
|
|
12
|
-
type AllowParams<T = Record<string, unknown>> = PolicyRuleParams<T>;
|
|
13
|
-
type ForbidParams<T = Record<string, unknown>> = PolicyRuleParams<T>;
|
|
14
|
-
//#endregion
|
|
15
|
-
export { Action, AllowParams, ForbidParams };
|
|
16
|
-
//# sourceMappingURL=types.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/lib/policy/types.ts"],"mappings":";;;KAEY,MAAA;AAAA,KAEA,cAAA,MACV,CAAA,SAAU,MAAA,oBACN,eAAA,CAAgB,CAAA,IAAK,UAAA,CAAW,CAAA,IAChC,eAAA,CAAgB,CAAA;AAAA,KAEV,UAAA,KAAe,MAAA,mCACb,CAAA,IAAK,cAAA,CAAe,CAAA,CAAE,CAAA;AAAA,KAU/B,gBAAA,KAAqB,MAAA;EACxB,MAAA,EAAQ,MAAA,GAAS,MAAA;EACjB,UAAA,GAAa,UAAA,CAAW,CAAA;EACxB,MAAA;AAAA;AAAA,KAGU,WAAA,KAAgB,MAAA,qBAA2B,gBAAA,CAAiB,CAAA;AAAA,KAE5D,YAAA,KAAiB,MAAA,qBAA2B,gBAAA,CAAiB,CAAA"}
|
package/dist/policy/types.d.mts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ConditionHelper } from "./helpers.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/lib/policy/types.d.ts
|
|
4
|
-
type Action = "read" | "create" | "update" | "delete" | (string & {});
|
|
5
|
-
type ConditionValue<V> = V extends Record<string, unknown> ? ConditionHelper<V> | Conditions<V> : ConditionHelper<V>;
|
|
6
|
-
type Conditions<T = Record<string, unknown>> = { [K in keyof T]?: ConditionValue<T[K]> };
|
|
7
|
-
type PolicyRuleParams<T = Record<string, unknown>> = {
|
|
8
|
-
action: Action | Action[];
|
|
9
|
-
conditions?: Conditions<T>;
|
|
10
|
-
reason?: string;
|
|
11
|
-
};
|
|
12
|
-
type AllowParams<T = Record<string, unknown>> = PolicyRuleParams<T>;
|
|
13
|
-
type ForbidParams<T = Record<string, unknown>> = PolicyRuleParams<T>;
|
|
14
|
-
//#endregion
|
|
15
|
-
export { Action, AllowParams, ForbidParams };
|
|
16
|
-
//# sourceMappingURL=types.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/policy/types.ts"],"mappings":";;;KAEY,MAAA;AAAA,KAEA,cAAA,MACV,CAAA,SAAU,MAAA,oBACN,eAAA,CAAgB,CAAA,IAAK,UAAA,CAAW,CAAA,IAChC,eAAA,CAAgB,CAAA;AAAA,KAEV,UAAA,KAAe,MAAA,mCACb,CAAA,IAAK,cAAA,CAAe,CAAA,CAAE,CAAA;AAAA,KAU/B,gBAAA,KAAqB,MAAA;EACxB,MAAA,EAAQ,MAAA,GAAS,MAAA;EACjB,UAAA,GAAa,UAAA,CAAW,CAAA;EACxB,MAAA;AAAA;AAAA,KAGU,WAAA,KAAgB,MAAA,qBAA2B,gBAAA,CAAiB,CAAA;AAAA,KAE5D,YAAA,KAAiB,MAAA,qBAA2B,gBAAA,CAAiB,CAAA"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
//#region src/lib/prompts/core/keys.ts
|
|
2
|
-
const ESC = "\x1B";
|
|
3
|
-
const CSI = "\x1B[";
|
|
4
|
-
const ESC_BACKSPACE = `${ESC}\u007F`;
|
|
5
|
-
const CHAR_KEY_MAP = new Map(Object.values({
|
|
6
|
-
enterCr: {
|
|
7
|
-
value: "\r",
|
|
8
|
-
name: "enter"
|
|
9
|
-
},
|
|
10
|
-
enterLf: {
|
|
11
|
-
value: "\n",
|
|
12
|
-
name: "enter"
|
|
13
|
-
},
|
|
14
|
-
ctrlA: {
|
|
15
|
-
value: "",
|
|
16
|
-
name: "ctrl_a"
|
|
17
|
-
},
|
|
18
|
-
ctrlC: {
|
|
19
|
-
value: "",
|
|
20
|
-
name: "ctrl_c"
|
|
21
|
-
},
|
|
22
|
-
ctrlBackspace: {
|
|
23
|
-
value: "",
|
|
24
|
-
name: "ctrl_backspace"
|
|
25
|
-
},
|
|
26
|
-
backspace: {
|
|
27
|
-
value: "",
|
|
28
|
-
name: "backspace"
|
|
29
|
-
},
|
|
30
|
-
tab: {
|
|
31
|
-
value: " ",
|
|
32
|
-
name: "tab"
|
|
33
|
-
},
|
|
34
|
-
space: {
|
|
35
|
-
value: " ",
|
|
36
|
-
name: "space"
|
|
37
|
-
}
|
|
38
|
-
}).map((entry) => [entry.value, { name: entry.name }]));
|
|
39
|
-
const KNOWN_SEQUENCES = [
|
|
40
|
-
{
|
|
41
|
-
sequence: "\x1B[1;2D",
|
|
42
|
-
key: { name: "shift_left" }
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
sequence: "\x1B[1;2C",
|
|
46
|
-
key: { name: "shift_right" }
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
sequence: "\x1B[1;5D",
|
|
50
|
-
key: { name: "ctrl_left" }
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
sequence: "\x1B[1;5C",
|
|
54
|
-
key: { name: "ctrl_right" }
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
sequence: "\x1B[1;6D",
|
|
58
|
-
key: { name: "shift_ctrl_left" }
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
sequence: "\x1B[1;6C",
|
|
62
|
-
key: { name: "shift_ctrl_right" }
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
sequence: "\x1B[3~",
|
|
66
|
-
key: { name: "delete" }
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
sequence: "\x1B[H",
|
|
70
|
-
key: { name: "home" }
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
sequence: "\x1B[F",
|
|
74
|
-
key: { name: "end" }
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
sequence: "\x1B[A",
|
|
78
|
-
key: { name: "up" }
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
sequence: "\x1B[B",
|
|
82
|
-
key: { name: "down" }
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
sequence: "\x1B[C",
|
|
86
|
-
key: { name: "right" }
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
sequence: "\x1B[D",
|
|
90
|
-
key: { name: "left" }
|
|
91
|
-
}
|
|
92
|
-
];
|
|
93
|
-
const isControlChar = (char) => {
|
|
94
|
-
return char <= "" || char === "";
|
|
95
|
-
};
|
|
96
|
-
const isCsiFinalByte = (char) => {
|
|
97
|
-
if (!char) return false;
|
|
98
|
-
if (char >= "A" && char <= "Z") return true;
|
|
99
|
-
if (char >= "a" && char <= "z") return true;
|
|
100
|
-
if (char === "~") return true;
|
|
101
|
-
return false;
|
|
102
|
-
};
|
|
103
|
-
const readCsiLength = (remaining) => {
|
|
104
|
-
if (!remaining.startsWith(CSI)) return null;
|
|
105
|
-
let index = 2;
|
|
106
|
-
while (index < remaining.length) {
|
|
107
|
-
if (isCsiFinalByte(remaining[index] ?? "")) return {
|
|
108
|
-
length: index + 1,
|
|
109
|
-
incomplete: false
|
|
110
|
-
};
|
|
111
|
-
index += 1;
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
length: 0,
|
|
115
|
-
incomplete: true
|
|
116
|
-
};
|
|
117
|
-
};
|
|
118
|
-
const parseKeys = (chunk) => {
|
|
119
|
-
const keys = [];
|
|
120
|
-
let cursor = 0;
|
|
121
|
-
while (cursor < chunk.length) {
|
|
122
|
-
const remaining = chunk.slice(cursor);
|
|
123
|
-
if (remaining.startsWith(ESC_BACKSPACE)) {
|
|
124
|
-
keys.push({ name: "ctrl_backspace" });
|
|
125
|
-
cursor += 2;
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
const knownSequence = KNOWN_SEQUENCES.find((entry) => remaining.startsWith(entry.sequence));
|
|
129
|
-
if (knownSequence) {
|
|
130
|
-
keys.push(knownSequence.key);
|
|
131
|
-
cursor += knownSequence.sequence.length;
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
const csiLength = readCsiLength(remaining);
|
|
135
|
-
if (csiLength) {
|
|
136
|
-
if (csiLength.incomplete) return {
|
|
137
|
-
keys,
|
|
138
|
-
remaining: chunk.slice(cursor)
|
|
139
|
-
};
|
|
140
|
-
cursor += csiLength.length;
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
const char = chunk[cursor] ?? "";
|
|
144
|
-
switch (char) {
|
|
145
|
-
case ESC:
|
|
146
|
-
if (cursor === chunk.length - 1) keys.push({ name: "escape" });
|
|
147
|
-
break;
|
|
148
|
-
default: {
|
|
149
|
-
const key = CHAR_KEY_MAP.get(char);
|
|
150
|
-
if (key) keys.push(key);
|
|
151
|
-
else if (!isControlChar(char)) keys.push({
|
|
152
|
-
name: "character",
|
|
153
|
-
value: char
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
cursor += 1;
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
keys,
|
|
161
|
-
remaining: ""
|
|
162
|
-
};
|
|
163
|
-
};
|
|
164
|
-
//#endregion
|
|
165
|
-
exports.parseKeys = parseKeys;
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
//#region src/lib/prompts/core/keys.ts
|
|
2
|
-
const ESC = "\x1B";
|
|
3
|
-
const CSI = "\x1B[";
|
|
4
|
-
const ESC_BACKSPACE = `${ESC}\u007F`;
|
|
5
|
-
const CHAR_KEY_MAP = new Map(Object.values({
|
|
6
|
-
enterCr: {
|
|
7
|
-
value: "\r",
|
|
8
|
-
name: "enter"
|
|
9
|
-
},
|
|
10
|
-
enterLf: {
|
|
11
|
-
value: "\n",
|
|
12
|
-
name: "enter"
|
|
13
|
-
},
|
|
14
|
-
ctrlA: {
|
|
15
|
-
value: "",
|
|
16
|
-
name: "ctrl_a"
|
|
17
|
-
},
|
|
18
|
-
ctrlC: {
|
|
19
|
-
value: "",
|
|
20
|
-
name: "ctrl_c"
|
|
21
|
-
},
|
|
22
|
-
ctrlBackspace: {
|
|
23
|
-
value: "",
|
|
24
|
-
name: "ctrl_backspace"
|
|
25
|
-
},
|
|
26
|
-
backspace: {
|
|
27
|
-
value: "",
|
|
28
|
-
name: "backspace"
|
|
29
|
-
},
|
|
30
|
-
tab: {
|
|
31
|
-
value: " ",
|
|
32
|
-
name: "tab"
|
|
33
|
-
},
|
|
34
|
-
space: {
|
|
35
|
-
value: " ",
|
|
36
|
-
name: "space"
|
|
37
|
-
}
|
|
38
|
-
}).map((entry) => [entry.value, { name: entry.name }]));
|
|
39
|
-
const KNOWN_SEQUENCES = [
|
|
40
|
-
{
|
|
41
|
-
sequence: "\x1B[1;2D",
|
|
42
|
-
key: { name: "shift_left" }
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
sequence: "\x1B[1;2C",
|
|
46
|
-
key: { name: "shift_right" }
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
sequence: "\x1B[1;5D",
|
|
50
|
-
key: { name: "ctrl_left" }
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
sequence: "\x1B[1;5C",
|
|
54
|
-
key: { name: "ctrl_right" }
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
sequence: "\x1B[1;6D",
|
|
58
|
-
key: { name: "shift_ctrl_left" }
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
sequence: "\x1B[1;6C",
|
|
62
|
-
key: { name: "shift_ctrl_right" }
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
sequence: "\x1B[3~",
|
|
66
|
-
key: { name: "delete" }
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
sequence: "\x1B[H",
|
|
70
|
-
key: { name: "home" }
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
sequence: "\x1B[F",
|
|
74
|
-
key: { name: "end" }
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
sequence: "\x1B[A",
|
|
78
|
-
key: { name: "up" }
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
sequence: "\x1B[B",
|
|
82
|
-
key: { name: "down" }
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
sequence: "\x1B[C",
|
|
86
|
-
key: { name: "right" }
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
sequence: "\x1B[D",
|
|
90
|
-
key: { name: "left" }
|
|
91
|
-
}
|
|
92
|
-
];
|
|
93
|
-
const isControlChar = (char) => {
|
|
94
|
-
return char <= "" || char === "";
|
|
95
|
-
};
|
|
96
|
-
const isCsiFinalByte = (char) => {
|
|
97
|
-
if (!char) return false;
|
|
98
|
-
if (char >= "A" && char <= "Z") return true;
|
|
99
|
-
if (char >= "a" && char <= "z") return true;
|
|
100
|
-
if (char === "~") return true;
|
|
101
|
-
return false;
|
|
102
|
-
};
|
|
103
|
-
const readCsiLength = (remaining) => {
|
|
104
|
-
if (!remaining.startsWith(CSI)) return null;
|
|
105
|
-
let index = 2;
|
|
106
|
-
while (index < remaining.length) {
|
|
107
|
-
if (isCsiFinalByte(remaining[index] ?? "")) return {
|
|
108
|
-
length: index + 1,
|
|
109
|
-
incomplete: false
|
|
110
|
-
};
|
|
111
|
-
index += 1;
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
length: 0,
|
|
115
|
-
incomplete: true
|
|
116
|
-
};
|
|
117
|
-
};
|
|
118
|
-
const parseKeys = (chunk) => {
|
|
119
|
-
const keys = [];
|
|
120
|
-
let cursor = 0;
|
|
121
|
-
while (cursor < chunk.length) {
|
|
122
|
-
const remaining = chunk.slice(cursor);
|
|
123
|
-
if (remaining.startsWith(ESC_BACKSPACE)) {
|
|
124
|
-
keys.push({ name: "ctrl_backspace" });
|
|
125
|
-
cursor += 2;
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
const knownSequence = KNOWN_SEQUENCES.find((entry) => remaining.startsWith(entry.sequence));
|
|
129
|
-
if (knownSequence) {
|
|
130
|
-
keys.push(knownSequence.key);
|
|
131
|
-
cursor += knownSequence.sequence.length;
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
const csiLength = readCsiLength(remaining);
|
|
135
|
-
if (csiLength) {
|
|
136
|
-
if (csiLength.incomplete) return {
|
|
137
|
-
keys,
|
|
138
|
-
remaining: chunk.slice(cursor)
|
|
139
|
-
};
|
|
140
|
-
cursor += csiLength.length;
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
const char = chunk[cursor] ?? "";
|
|
144
|
-
switch (char) {
|
|
145
|
-
case ESC:
|
|
146
|
-
if (cursor === chunk.length - 1) keys.push({ name: "escape" });
|
|
147
|
-
break;
|
|
148
|
-
default: {
|
|
149
|
-
const key = CHAR_KEY_MAP.get(char);
|
|
150
|
-
if (key) keys.push(key);
|
|
151
|
-
else if (!isControlChar(char)) keys.push({
|
|
152
|
-
name: "character",
|
|
153
|
-
value: char
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
cursor += 1;
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
keys,
|
|
161
|
-
remaining: ""
|
|
162
|
-
};
|
|
163
|
-
};
|
|
164
|
-
//#endregion
|
|
165
|
-
export { parseKeys };
|
|
166
|
-
|
|
167
|
-
//# sourceMappingURL=keys.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.mjs","names":[],"sources":["../../../src/lib/prompts/core/keys.ts"],"sourcesContent":["import type { Key, KeyName } from \"./types.js\";\n\nconst ESC = \"\\u001B\";\nconst CSI = \"\\u001B[\";\nconst ESC_BACKSPACE = `${ESC}\\u007F`;\n\nconst CHAR_KEYS = {\n enterCr: { value: \"\\r\", name: \"enter\" },\n enterLf: { value: \"\\n\", name: \"enter\" },\n ctrlA: { value: \"\\u0001\", name: \"ctrl_a\" },\n ctrlC: { value: \"\\u0003\", name: \"ctrl_c\" },\n ctrlBackspace: { value: \"\\u0017\", name: \"ctrl_backspace\" },\n backspace: { value: \"\\u007F\", name: \"backspace\" },\n tab: { value: \"\\t\", name: \"tab\" },\n space: { value: \" \", name: \"space\" },\n} satisfies Record<string, { value: string; name: KeyName }>;\n\nconst CHAR_KEY_MAP = new Map<string, Key>(\n Object.values(CHAR_KEYS).map((entry) => [entry.value, { name: entry.name }]),\n);\n\nconst KNOWN_SEQUENCES = [\n { sequence: \"\\u001B[1;2D\", key: { name: \"shift_left\" } },\n { sequence: \"\\u001B[1;2C\", key: { name: \"shift_right\" } },\n { sequence: \"\\u001B[1;5D\", key: { name: \"ctrl_left\" } },\n { sequence: \"\\u001B[1;5C\", key: { name: \"ctrl_right\" } },\n { sequence: \"\\u001B[1;6D\", key: { name: \"shift_ctrl_left\" } },\n { sequence: \"\\u001B[1;6C\", key: { name: \"shift_ctrl_right\" } },\n { sequence: \"\\u001B[3~\", key: { name: \"delete\" } },\n { sequence: \"\\u001B[H\", key: { name: \"home\" } },\n { sequence: \"\\u001B[F\", key: { name: \"end\" } },\n { sequence: \"\\u001B[A\", key: { name: \"up\" } },\n { sequence: \"\\u001B[B\", key: { name: \"down\" } },\n { sequence: \"\\u001B[C\", key: { name: \"right\" } },\n { sequence: \"\\u001B[D\", key: { name: \"left\" } },\n] as const;\n\nconst isControlChar = (char: string) => {\n return char <= \"\\u001F\" || char === \"\\u007F\";\n};\n\nconst isCsiFinalByte = (char: string) => {\n if (!char) {\n return false;\n }\n\n if (char >= \"A\" && char <= \"Z\") {\n return true;\n }\n\n if (char >= \"a\" && char <= \"z\") {\n return true;\n }\n\n if (char === \"~\") {\n return true;\n }\n\n return false;\n};\n\nconst readCsiLength = (remaining: string) => {\n if (!remaining.startsWith(CSI)) {\n return null;\n }\n\n let index = CSI.length;\n\n while (index < remaining.length) {\n const char = remaining[index] ?? \"\";\n\n if (isCsiFinalByte(char)) {\n return { length: index + 1, incomplete: false };\n }\n\n index += 1;\n }\n\n return { length: 0, incomplete: true };\n};\n\nexport const parseKeys = (chunk: string) => {\n const keys: Key[] = [];\n\n let cursor = 0;\n\n while (cursor < chunk.length) {\n const remaining = chunk.slice(cursor);\n\n if (remaining.startsWith(ESC_BACKSPACE)) {\n keys.push({ name: \"ctrl_backspace\" });\n cursor += 2;\n continue;\n }\n\n const knownSequence = KNOWN_SEQUENCES.find((entry) =>\n remaining.startsWith(entry.sequence),\n );\n\n if (knownSequence) {\n keys.push(knownSequence.key);\n cursor += knownSequence.sequence.length;\n continue;\n }\n\n const csiLength = readCsiLength(remaining);\n\n if (csiLength) {\n if (csiLength.incomplete) {\n return { keys, remaining: chunk.slice(cursor) };\n }\n\n cursor += csiLength.length;\n continue;\n }\n\n const char = chunk[cursor] ?? \"\";\n\n switch (char) {\n case ESC: {\n if (cursor === chunk.length - 1) {\n keys.push({ name: \"escape\" });\n }\n break;\n }\n default: {\n const key = CHAR_KEY_MAP.get(char);\n\n if (key) {\n keys.push(key);\n } else if (!isControlChar(char)) {\n keys.push({ name: \"character\", value: char });\n }\n }\n }\n\n cursor += 1;\n }\n\n return { keys, remaining: \"\" };\n};\n"],"mappings":"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"}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
const require_lib_errors_index = require("../../lib/errors/index.cjs");
|
|
2
|
-
const require_keys = require("./keys.cjs");
|
|
3
|
-
//#region src/lib/prompts/core/runtime.ts
|
|
4
|
-
const HIDE_CURSOR = "\x1B[?25l";
|
|
5
|
-
const SHOW_CURSOR = "\x1B[?25h";
|
|
6
|
-
const countLines = (text) => {
|
|
7
|
-
let count = 1;
|
|
8
|
-
for (let i = 0; i < text.length; i++) if (text[i] === "\n") count += 1;
|
|
9
|
-
return count;
|
|
10
|
-
};
|
|
11
|
-
var NodePromptRuntime = class {
|
|
12
|
-
stdin;
|
|
13
|
-
stdout;
|
|
14
|
-
queue = [];
|
|
15
|
-
waiters = [];
|
|
16
|
-
initialized = false;
|
|
17
|
-
previousLines = 0;
|
|
18
|
-
buffer = "";
|
|
19
|
-
constructor(stdin = process.stdin, stdout = process.stdout) {
|
|
20
|
-
this.stdin = stdin;
|
|
21
|
-
this.stdout = stdout;
|
|
22
|
-
}
|
|
23
|
-
isInteractive() {
|
|
24
|
-
return Boolean(this.stdin.isTTY && this.stdout.isTTY && typeof this.stdin.setRawMode === "function");
|
|
25
|
-
}
|
|
26
|
-
init() {
|
|
27
|
-
if (!this.isInteractive()) return require_lib_errors_index.err("PromptEnvironmentError", "Interactive prompts require a TTY with raw mode support");
|
|
28
|
-
if (this.initialized) return require_lib_errors_index.ok(void 0);
|
|
29
|
-
const [initError] = require_lib_errors_index.mightThrowSync(() => {
|
|
30
|
-
this.stdin.setRawMode(true);
|
|
31
|
-
this.stdin.setEncoding("utf8");
|
|
32
|
-
this.stdin.resume();
|
|
33
|
-
this.stdin.on("data", this.onData);
|
|
34
|
-
this.stdout.write(HIDE_CURSOR);
|
|
35
|
-
});
|
|
36
|
-
if (initError) return require_lib_errors_index.err("PromptIOError", "Unable to initialize prompt runtime");
|
|
37
|
-
this.initialized = true;
|
|
38
|
-
return require_lib_errors_index.ok(void 0);
|
|
39
|
-
}
|
|
40
|
-
readKey() {
|
|
41
|
-
const queued = this.queue.shift();
|
|
42
|
-
if (queued) return Promise.resolve(require_lib_errors_index.ok(queued));
|
|
43
|
-
return new Promise((resolve) => {
|
|
44
|
-
this.waiters.push(resolve);
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
render(frame) {
|
|
48
|
-
const [renderError] = require_lib_errors_index.mightThrowSync(() => {
|
|
49
|
-
if (this.previousLines > 1) this.stdout.write(`\u001B[${this.previousLines - 1}A`);
|
|
50
|
-
this.stdout.write("\r\x1B[J");
|
|
51
|
-
this.stdout.write(frame);
|
|
52
|
-
this.previousLines = countLines(frame);
|
|
53
|
-
});
|
|
54
|
-
if (renderError) return require_lib_errors_index.err("PromptIOError", "Unable to render prompt frame");
|
|
55
|
-
return require_lib_errors_index.ok(void 0);
|
|
56
|
-
}
|
|
57
|
-
done(frame) {
|
|
58
|
-
const [doneError] = require_lib_errors_index.mightThrowSync(() => {
|
|
59
|
-
if (this.previousLines > 1) this.stdout.write(`\u001B[${this.previousLines - 1}A`);
|
|
60
|
-
this.stdout.write("\r\x1B[J");
|
|
61
|
-
this.stdout.write(`${frame}\n`);
|
|
62
|
-
this.previousLines = 0;
|
|
63
|
-
});
|
|
64
|
-
if (doneError) return require_lib_errors_index.err("PromptIOError", "Unable to finalize prompt frame");
|
|
65
|
-
return require_lib_errors_index.ok(void 0);
|
|
66
|
-
}
|
|
67
|
-
close() {
|
|
68
|
-
if (!this.initialized) return require_lib_errors_index.ok(void 0);
|
|
69
|
-
this.initialized = false;
|
|
70
|
-
const [closeError] = require_lib_errors_index.mightThrowSync(() => {
|
|
71
|
-
this.stdin.off("data", this.onData);
|
|
72
|
-
this.stdin.setRawMode(false);
|
|
73
|
-
this.stdin.pause?.();
|
|
74
|
-
this.stdout.write(SHOW_CURSOR);
|
|
75
|
-
});
|
|
76
|
-
if (closeError) return require_lib_errors_index.err("PromptIOError", "Unable to close prompt runtime");
|
|
77
|
-
return require_lib_errors_index.ok(void 0);
|
|
78
|
-
}
|
|
79
|
-
interrupt() {
|
|
80
|
-
this.close();
|
|
81
|
-
process.exit(0);
|
|
82
|
-
}
|
|
83
|
-
onData = (chunk) => {
|
|
84
|
-
const value = typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
85
|
-
const combined = `${this.buffer}${value}`;
|
|
86
|
-
this.buffer = "";
|
|
87
|
-
const [parseError, result] = require_lib_errors_index.mightThrowSync(() => require_keys.parseKeys(combined));
|
|
88
|
-
if (parseError || !result) {
|
|
89
|
-
for (const waiter of this.waiters.splice(0)) waiter(require_lib_errors_index.err("PromptIOError", "Failed to parse input"));
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
this.buffer = result.remaining;
|
|
93
|
-
for (const key of result.keys) {
|
|
94
|
-
const waiter = this.waiters.shift();
|
|
95
|
-
if (waiter) waiter(require_lib_errors_index.ok(key));
|
|
96
|
-
else this.queue.push(key);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
};
|
|
100
|
-
const createNodePromptRuntime = () => {
|
|
101
|
-
return new NodePromptRuntime();
|
|
102
|
-
};
|
|
103
|
-
//#endregion
|
|
104
|
-
exports.createNodePromptRuntime = createNodePromptRuntime;
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { err, mightThrowSync, ok } from "../../lib/errors/index.mjs";
|
|
2
|
-
import { parseKeys } from "./keys.mjs";
|
|
3
|
-
//#region src/lib/prompts/core/runtime.ts
|
|
4
|
-
const HIDE_CURSOR = "\x1B[?25l";
|
|
5
|
-
const SHOW_CURSOR = "\x1B[?25h";
|
|
6
|
-
const countLines = (text) => {
|
|
7
|
-
let count = 1;
|
|
8
|
-
for (let i = 0; i < text.length; i++) if (text[i] === "\n") count += 1;
|
|
9
|
-
return count;
|
|
10
|
-
};
|
|
11
|
-
var NodePromptRuntime = class {
|
|
12
|
-
stdin;
|
|
13
|
-
stdout;
|
|
14
|
-
queue = [];
|
|
15
|
-
waiters = [];
|
|
16
|
-
initialized = false;
|
|
17
|
-
previousLines = 0;
|
|
18
|
-
buffer = "";
|
|
19
|
-
constructor(stdin = process.stdin, stdout = process.stdout) {
|
|
20
|
-
this.stdin = stdin;
|
|
21
|
-
this.stdout = stdout;
|
|
22
|
-
}
|
|
23
|
-
isInteractive() {
|
|
24
|
-
return Boolean(this.stdin.isTTY && this.stdout.isTTY && typeof this.stdin.setRawMode === "function");
|
|
25
|
-
}
|
|
26
|
-
init() {
|
|
27
|
-
if (!this.isInteractive()) return err("PromptEnvironmentError", "Interactive prompts require a TTY with raw mode support");
|
|
28
|
-
if (this.initialized) return ok(void 0);
|
|
29
|
-
const [initError] = mightThrowSync(() => {
|
|
30
|
-
this.stdin.setRawMode(true);
|
|
31
|
-
this.stdin.setEncoding("utf8");
|
|
32
|
-
this.stdin.resume();
|
|
33
|
-
this.stdin.on("data", this.onData);
|
|
34
|
-
this.stdout.write(HIDE_CURSOR);
|
|
35
|
-
});
|
|
36
|
-
if (initError) return err("PromptIOError", "Unable to initialize prompt runtime");
|
|
37
|
-
this.initialized = true;
|
|
38
|
-
return ok(void 0);
|
|
39
|
-
}
|
|
40
|
-
readKey() {
|
|
41
|
-
const queued = this.queue.shift();
|
|
42
|
-
if (queued) return Promise.resolve(ok(queued));
|
|
43
|
-
return new Promise((resolve) => {
|
|
44
|
-
this.waiters.push(resolve);
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
render(frame) {
|
|
48
|
-
const [renderError] = mightThrowSync(() => {
|
|
49
|
-
if (this.previousLines > 1) this.stdout.write(`\u001B[${this.previousLines - 1}A`);
|
|
50
|
-
this.stdout.write("\r\x1B[J");
|
|
51
|
-
this.stdout.write(frame);
|
|
52
|
-
this.previousLines = countLines(frame);
|
|
53
|
-
});
|
|
54
|
-
if (renderError) return err("PromptIOError", "Unable to render prompt frame");
|
|
55
|
-
return ok(void 0);
|
|
56
|
-
}
|
|
57
|
-
done(frame) {
|
|
58
|
-
const [doneError] = mightThrowSync(() => {
|
|
59
|
-
if (this.previousLines > 1) this.stdout.write(`\u001B[${this.previousLines - 1}A`);
|
|
60
|
-
this.stdout.write("\r\x1B[J");
|
|
61
|
-
this.stdout.write(`${frame}\n`);
|
|
62
|
-
this.previousLines = 0;
|
|
63
|
-
});
|
|
64
|
-
if (doneError) return err("PromptIOError", "Unable to finalize prompt frame");
|
|
65
|
-
return ok(void 0);
|
|
66
|
-
}
|
|
67
|
-
close() {
|
|
68
|
-
if (!this.initialized) return ok(void 0);
|
|
69
|
-
this.initialized = false;
|
|
70
|
-
const [closeError] = mightThrowSync(() => {
|
|
71
|
-
this.stdin.off("data", this.onData);
|
|
72
|
-
this.stdin.setRawMode(false);
|
|
73
|
-
this.stdin.pause?.();
|
|
74
|
-
this.stdout.write(SHOW_CURSOR);
|
|
75
|
-
});
|
|
76
|
-
if (closeError) return err("PromptIOError", "Unable to close prompt runtime");
|
|
77
|
-
return ok(void 0);
|
|
78
|
-
}
|
|
79
|
-
interrupt() {
|
|
80
|
-
this.close();
|
|
81
|
-
process.exit(0);
|
|
82
|
-
}
|
|
83
|
-
onData = (chunk) => {
|
|
84
|
-
const value = typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
85
|
-
const combined = `${this.buffer}${value}`;
|
|
86
|
-
this.buffer = "";
|
|
87
|
-
const [parseError, result] = mightThrowSync(() => parseKeys(combined));
|
|
88
|
-
if (parseError || !result) {
|
|
89
|
-
for (const waiter of this.waiters.splice(0)) waiter(err("PromptIOError", "Failed to parse input"));
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
this.buffer = result.remaining;
|
|
93
|
-
for (const key of result.keys) {
|
|
94
|
-
const waiter = this.waiters.shift();
|
|
95
|
-
if (waiter) waiter(ok(key));
|
|
96
|
-
else this.queue.push(key);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
};
|
|
100
|
-
const createNodePromptRuntime = () => {
|
|
101
|
-
return new NodePromptRuntime();
|
|
102
|
-
};
|
|
103
|
-
//#endregion
|
|
104
|
-
export { createNodePromptRuntime };
|
|
105
|
-
|
|
106
|
-
//# sourceMappingURL=runtime.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.mjs","names":[],"sources":["../../../src/lib/prompts/core/runtime.ts"],"sourcesContent":["import { err, mightThrowSync, ok } from \"../../errors/index.js\";\nimport { parseKeys } from \"./keys.js\";\nimport type { Key, PromptResultLike, PromptRuntime } from \"./types.js\";\n\nconst HIDE_CURSOR = \"\\u001B[?25l\";\nconst SHOW_CURSOR = \"\\u001B[?25h\";\n\nconst countLines = (text: string) => {\n let count = 1;\n\n for (let i = 0; i < text.length; i++) {\n if (text[i] === \"\\n\") {\n count += 1;\n }\n }\n\n return count;\n};\n\ntype StdinLike = {\n isTTY?: boolean;\n setRawMode: (mode: boolean) => void;\n setEncoding: (encoding: BufferEncoding) => void;\n resume: () => void;\n pause?: () => void;\n on: (event: string, listener: (chunk: Buffer | string) => void) => unknown;\n off: (event: string, listener: (chunk: Buffer | string) => void) => unknown;\n};\n\ntype StdoutLike = {\n isTTY?: boolean;\n write: (chunk: string) => boolean;\n};\n\nexport class NodePromptRuntime implements PromptRuntime {\n private readonly stdin: StdinLike;\n private readonly stdout: StdoutLike;\n private readonly queue: Key[] = [];\n private readonly waiters: Array<(result: PromptResultLike<Key>) => void> = [];\n private initialized = false;\n private previousLines = 0;\n private buffer = \"\";\n\n public constructor(\n stdin: StdinLike = process.stdin,\n stdout: StdoutLike = process.stdout,\n ) {\n this.stdin = stdin;\n this.stdout = stdout;\n }\n\n public isInteractive() {\n return Boolean(\n this.stdin.isTTY &&\n this.stdout.isTTY &&\n typeof this.stdin.setRawMode === \"function\",\n );\n }\n\n public init() {\n if (!this.isInteractive()) {\n return err(\n \"PromptEnvironmentError\",\n \"Interactive prompts require a TTY with raw mode support\",\n );\n }\n\n if (this.initialized) {\n return ok(undefined);\n }\n\n const [initError] = mightThrowSync(() => {\n this.stdin.setRawMode(true);\n this.stdin.setEncoding(\"utf8\");\n this.stdin.resume();\n this.stdin.on(\"data\", this.onData);\n this.stdout.write(HIDE_CURSOR);\n });\n\n if (initError) {\n return err(\"PromptIOError\", \"Unable to initialize prompt runtime\");\n }\n\n this.initialized = true;\n return ok(undefined);\n }\n\n public readKey(): Promise<PromptResultLike<Key>> {\n const queued = this.queue.shift();\n\n if (queued) {\n return Promise.resolve(ok(queued));\n }\n\n return new Promise<PromptResultLike<Key>>((resolve) => {\n this.waiters.push(resolve);\n });\n }\n\n public render(frame: string) {\n const [renderError] = mightThrowSync(() => {\n if (this.previousLines > 1) {\n this.stdout.write(`\\u001B[${this.previousLines - 1}A`);\n }\n\n this.stdout.write(\"\\r\\u001B[J\");\n this.stdout.write(frame);\n\n this.previousLines = countLines(frame);\n });\n\n if (renderError) {\n return err(\"PromptIOError\", \"Unable to render prompt frame\");\n }\n\n return ok(undefined);\n }\n\n public done(frame: string) {\n const [doneError] = mightThrowSync(() => {\n if (this.previousLines > 1) {\n this.stdout.write(`\\u001B[${this.previousLines - 1}A`);\n }\n\n this.stdout.write(\"\\r\\u001B[J\");\n this.stdout.write(`${frame}\\n`);\n this.previousLines = 0;\n });\n\n if (doneError) {\n return err(\"PromptIOError\", \"Unable to finalize prompt frame\");\n }\n\n return ok(undefined);\n }\n\n public close() {\n if (!this.initialized) {\n return ok(undefined);\n }\n\n this.initialized = false;\n\n const [closeError] = mightThrowSync(() => {\n this.stdin.off(\"data\", this.onData);\n this.stdin.setRawMode(false);\n this.stdin.pause?.();\n this.stdout.write(SHOW_CURSOR);\n });\n\n if (closeError) {\n return err(\"PromptIOError\", \"Unable to close prompt runtime\");\n }\n\n return ok(undefined);\n }\n\n public interrupt(): never {\n this.close();\n process.exit(0);\n }\n\n private onData = (chunk: Buffer | string) => {\n const value = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n const combined = `${this.buffer}${value}`;\n this.buffer = \"\";\n\n const [parseError, result] = mightThrowSync(() => parseKeys(combined));\n\n if (parseError || !result) {\n for (const waiter of this.waiters.splice(0)) {\n waiter(err(\"PromptIOError\", \"Failed to parse input\"));\n }\n\n return;\n }\n\n this.buffer = result.remaining;\n\n for (const key of result.keys) {\n const waiter = this.waiters.shift();\n\n if (waiter) {\n waiter(ok(key));\n } else {\n this.queue.push(key);\n }\n }\n };\n}\n\nexport const createNodePromptRuntime = () => {\n return new NodePromptRuntime();\n};\n"],"mappings":"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"}
|