hikoutei 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ja.md +135 -0
- package/README.ko.md +138 -0
- package/README.md +143 -0
- package/apps-script/gateway/Code.gs +412 -0
- package/dist/adapter/persistence/contracts/index.d.ts +3 -0
- package/dist/adapter/persistence/contracts/index.d.ts.map +1 -0
- package/dist/adapter/persistence/contracts/index.js +3 -0
- package/dist/adapter/persistence/contracts/index.js.map +1 -0
- package/dist/adapter/persistence/contracts/sql.d.ts +50 -0
- package/dist/adapter/persistence/contracts/sql.d.ts.map +1 -0
- package/dist/adapter/persistence/contracts/sql.js +9 -0
- package/dist/adapter/persistence/contracts/sql.js.map +1 -0
- package/dist/adapter/persistence/index.d.ts +2 -0
- package/dist/adapter/persistence/index.d.ts.map +1 -0
- package/dist/adapter/persistence/index.js +2 -0
- package/dist/adapter/persistence/index.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts +53 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js +105 -0
- package/dist/adapter/persistence/providers/mikro-orm/api/MikroOrmTypedSheetsEntityManager.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts +39 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js +54 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmMappedTypedSheets.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts +38 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js +55 -0
- package/dist/adapter/persistence/providers/mikro-orm/engine/MikroOrmTypedSheetsEngine.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.d.ts +16 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.js +9 -0
- package/dist/adapter/persistence/providers/mikro-orm/index.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts +27 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js +67 -0
- package/dist/adapter/persistence/providers/mikro-orm/observation/MikroOrmMappedObservation.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts +19 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js +67 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmFlushChanges.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts +78 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js +121 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteAdapter.js.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts +20 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.d.ts.map +1 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js +125 -0
- package/dist/adapter/persistence/providers/mikro-orm/storage/MikroOrmSqliteSchema.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts +42 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.js +51 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/errors.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts +22 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js +12 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts +42 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js +161 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts +3 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js +692 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts +29 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js +538 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts +12 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js +190 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/read/tableReadOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts +23 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js +166 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/fastAppendOperation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts +50 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js +60 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/codeGsProtocol.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts +44 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js +40 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/constants.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts +7 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js +47 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/syncProtocol.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts +5 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js +54 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/timing.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts +5 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js +2 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/types.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts +10 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js +35 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/protocol/validation.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts +67 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js +204 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationClient.js.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts +78 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js +343 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js.map +1 -0
- package/dist/application/index.d.ts +4 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +4 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/orm/api/TypedSheetsOrm.d.ts +71 -0
- package/dist/application/orm/api/TypedSheetsOrm.d.ts.map +1 -0
- package/dist/application/orm/api/TypedSheetsOrm.js +116 -0
- package/dist/application/orm/api/TypedSheetsOrm.js.map +1 -0
- package/dist/application/orm/api/contracts.d.ts +118 -0
- package/dist/application/orm/api/contracts.d.ts.map +1 -0
- package/dist/application/orm/api/contracts.js +21 -0
- package/dist/application/orm/api/contracts.js.map +1 -0
- package/dist/application/orm/errors.d.ts +35 -0
- package/dist/application/orm/errors.d.ts.map +1 -0
- package/dist/application/orm/errors.js +35 -0
- package/dist/application/orm/errors.js.map +1 -0
- package/dist/application/orm/index.d.ts +13 -0
- package/dist/application/orm/index.d.ts.map +1 -0
- package/dist/application/orm/index.js +7 -0
- package/dist/application/orm/index.js.map +1 -0
- package/dist/application/orm/mapping/contracts.d.ts +113 -0
- package/dist/application/orm/mapping/contracts.d.ts.map +1 -0
- package/dist/application/orm/mapping/contracts.js +8 -0
- package/dist/application/orm/mapping/contracts.js.map +1 -0
- package/dist/application/orm/mapping/definition.d.ts +16 -0
- package/dist/application/orm/mapping/definition.d.ts.map +1 -0
- package/dist/application/orm/mapping/definition.js +145 -0
- package/dist/application/orm/mapping/definition.js.map +1 -0
- package/dist/application/orm/mapping/entityMapping.d.ts +13 -0
- package/dist/application/orm/mapping/entityMapping.d.ts.map +1 -0
- package/dist/application/orm/mapping/entityMapping.js +13 -0
- package/dist/application/orm/mapping/entityMapping.js.map +1 -0
- package/dist/application/orm/mapping/identity.d.ts +14 -0
- package/dist/application/orm/mapping/identity.d.ts.map +1 -0
- package/dist/application/orm/mapping/identity.js +37 -0
- package/dist/application/orm/mapping/identity.js.map +1 -0
- package/dist/application/orm/mapping/observationMapping.d.ts +42 -0
- package/dist/application/orm/mapping/observationMapping.d.ts.map +1 -0
- package/dist/application/orm/mapping/observationMapping.js +65 -0
- package/dist/application/orm/mapping/observationMapping.js.map +1 -0
- package/dist/application/orm/mapping/projection.d.ts +22 -0
- package/dist/application/orm/mapping/projection.d.ts.map +1 -0
- package/dist/application/orm/mapping/projection.js +74 -0
- package/dist/application/orm/mapping/projection.js.map +1 -0
- package/dist/application/orm/mapping/registry.d.ts +15 -0
- package/dist/application/orm/mapping/registry.d.ts.map +1 -0
- package/dist/application/orm/mapping/registry.js +38 -0
- package/dist/application/orm/mapping/registry.js.map +1 -0
- package/dist/application/orm/mapping/values.d.ts +17 -0
- package/dist/application/orm/mapping/values.d.ts.map +1 -0
- package/dist/application/orm/mapping/values.js +141 -0
- package/dist/application/orm/mapping/values.js.map +1 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts +28 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.d.ts.map +1 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.js +170 -0
- package/dist/application/orm/persistence/flush/flushCoordinator.js.map +1 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts +9 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.d.ts.map +1 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js +8 -0
- package/dist/application/orm/persistence/flush/mappedFlushCoordinator.js.map +1 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts +12 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.d.ts.map +1 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.js +134 -0
- package/dist/application/orm/persistence/lifecycle/entityLifecycle.js.map +1 -0
- package/dist/application/orm/persistence/projection/projectionEffects.d.ts +21 -0
- package/dist/application/orm/persistence/projection/projectionEffects.d.ts.map +1 -0
- package/dist/application/orm/persistence/projection/projectionEffects.js +203 -0
- package/dist/application/orm/persistence/projection/projectionEffects.js.map +1 -0
- package/dist/application/orm/persistence/support/businessKeys.d.ts +17 -0
- package/dist/application/orm/persistence/support/businessKeys.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/businessKeys.js +72 -0
- package/dist/application/orm/persistence/support/businessKeys.js.map +1 -0
- package/dist/application/orm/persistence/support/canonicalState.d.ts +22 -0
- package/dist/application/orm/persistence/support/canonicalState.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/canonicalState.js +88 -0
- package/dist/application/orm/persistence/support/canonicalState.js.map +1 -0
- package/dist/application/orm/persistence/support/contracts.d.ts +139 -0
- package/dist/application/orm/persistence/support/contracts.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/contracts.js +93 -0
- package/dist/application/orm/persistence/support/contracts.js.map +1 -0
- package/dist/application/orm/persistence/support/helpers.d.ts +32 -0
- package/dist/application/orm/persistence/support/helpers.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/helpers.js +66 -0
- package/dist/application/orm/persistence/support/helpers.js.map +1 -0
- package/dist/application/orm/persistence/support/timing.d.ts +20 -0
- package/dist/application/orm/persistence/support/timing.d.ts.map +1 -0
- package/dist/application/orm/persistence/support/timing.js +55 -0
- package/dist/application/orm/persistence/support/timing.js.map +1 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts +46 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.d.ts.map +1 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.js +93 -0
- package/dist/application/sync/gateway/SyncGatewayBootstrap.js.map +1 -0
- package/dist/application/sync/gateway/constants.d.ts +65 -0
- package/dist/application/sync/gateway/constants.d.ts.map +1 -0
- package/dist/application/sync/gateway/constants.js +57 -0
- package/dist/application/sync/gateway/constants.js.map +1 -0
- package/dist/application/sync/gateway/errors.d.ts +15 -0
- package/dist/application/sync/gateway/errors.d.ts.map +1 -0
- package/dist/application/sync/gateway/errors.js +16 -0
- package/dist/application/sync/gateway/errors.js.map +1 -0
- package/dist/application/sync/gateway/syncGateway.d.ts +313 -0
- package/dist/application/sync/gateway/syncGateway.d.ts.map +1 -0
- package/dist/application/sync/gateway/syncGateway.js +202 -0
- package/dist/application/sync/gateway/syncGateway.js.map +1 -0
- package/dist/application/sync/gateway/validation.d.ts +17 -0
- package/dist/application/sync/gateway/validation.d.ts.map +1 -0
- package/dist/application/sync/gateway/validation.js +60 -0
- package/dist/application/sync/gateway/validation.js.map +1 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts +72 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.d.ts.map +1 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.js +272 -0
- package/dist/application/sync/inbound/polling/SimpleSheetPolling.js.map +1 -0
- package/dist/application/sync/index.d.ts +16 -0
- package/dist/application/sync/index.d.ts.map +1 -0
- package/dist/application/sync/index.js +9 -0
- package/dist/application/sync/index.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts +106 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +297 -0
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +100 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js +345 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +46 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +63 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +20 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +102 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts +19 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js +32 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +30 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +202 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts +17 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js +80 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts +13 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts.map +1 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js +205 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js.map +1 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts +81 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.d.ts.map +1 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js +245 -0
- package/dist/application/sync/outbound/projection/ProjectionEffectFactory.js.map +1 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts +77 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts.map +1 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js +518 -0
- package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js.map +1 -0
- package/dist/application/sync/telemetry/syncTiming.d.ts +50 -0
- package/dist/application/sync/telemetry/syncTiming.d.ts.map +1 -0
- package/dist/application/sync/telemetry/syncTiming.js +22 -0
- package/dist/application/sync/telemetry/syncTiming.js.map +1 -0
- package/dist/domain/conflict/errors.d.ts +42 -0
- package/dist/domain/conflict/errors.d.ts.map +1 -0
- package/dist/domain/conflict/errors.js +36 -0
- package/dist/domain/conflict/errors.js.map +1 -0
- package/dist/domain/conflict/index.d.ts +5 -0
- package/dist/domain/conflict/index.d.ts.map +1 -0
- package/dist/domain/conflict/index.js +3 -0
- package/dist/domain/conflict/index.js.map +1 -0
- package/dist/domain/conflict/transitions.d.ts +52 -0
- package/dist/domain/conflict/transitions.d.ts.map +1 -0
- package/dist/domain/conflict/transitions.js +115 -0
- package/dist/domain/conflict/transitions.js.map +1 -0
- package/dist/domain/errors/evaluation.d.ts +13 -0
- package/dist/domain/errors/evaluation.d.ts.map +1 -0
- package/dist/domain/errors/evaluation.js +14 -0
- package/dist/domain/errors/evaluation.js.map +1 -0
- package/dist/domain/errors/identity.d.ts +12 -0
- package/dist/domain/errors/identity.d.ts.map +1 -0
- package/dist/domain/errors/identity.js +15 -0
- package/dist/domain/errors/identity.js.map +1 -0
- package/dist/domain/errors/index.d.ts +7 -0
- package/dist/domain/errors/index.d.ts.map +1 -0
- package/dist/domain/errors/index.js +5 -0
- package/dist/domain/errors/index.js.map +1 -0
- package/dist/domain/errors/stableEncoding.d.ts +7 -0
- package/dist/domain/errors/stableEncoding.d.ts.map +1 -0
- package/dist/domain/errors/stableEncoding.js +8 -0
- package/dist/domain/errors/stableEncoding.js.map +1 -0
- package/dist/domain/errors/types.d.ts +20 -0
- package/dist/domain/errors/types.d.ts.map +1 -0
- package/dist/domain/errors/types.js +18 -0
- package/dist/domain/errors/types.js.map +1 -0
- package/dist/domain/evaluate/constants.d.ts +55 -0
- package/dist/domain/evaluate/constants.d.ts.map +1 -0
- package/dist/domain/evaluate/constants.js +41 -0
- package/dist/domain/evaluate/constants.js.map +1 -0
- package/dist/domain/evaluate/contracts.d.ts +125 -0
- package/dist/domain/evaluate/contracts.d.ts.map +1 -0
- package/dist/domain/evaluate/contracts.js +8 -0
- package/dist/domain/evaluate/contracts.js.map +1 -0
- package/dist/domain/evaluate/evaluateBatch.d.ts +11 -0
- package/dist/domain/evaluate/evaluateBatch.d.ts.map +1 -0
- package/dist/domain/evaluate/evaluateBatch.js +91 -0
- package/dist/domain/evaluate/evaluateBatch.js.map +1 -0
- package/dist/domain/evaluate/fieldEvaluation.d.ts +14 -0
- package/dist/domain/evaluate/fieldEvaluation.d.ts.map +1 -0
- package/dist/domain/evaluate/fieldEvaluation.js +133 -0
- package/dist/domain/evaluate/fieldEvaluation.js.map +1 -0
- package/dist/domain/evaluate/identity.d.ts +21 -0
- package/dist/domain/evaluate/identity.d.ts.map +1 -0
- package/dist/domain/evaluate/identity.js +72 -0
- package/dist/domain/evaluate/identity.js.map +1 -0
- package/dist/domain/evaluate/index.d.ts +4 -0
- package/dist/domain/evaluate/index.d.ts.map +1 -0
- package/dist/domain/evaluate/index.js +3 -0
- package/dist/domain/evaluate/index.js.map +1 -0
- package/dist/domain/evaluate/preconditions.d.ts +30 -0
- package/dist/domain/evaluate/preconditions.d.ts.map +1 -0
- package/dist/domain/evaluate/preconditions.js +389 -0
- package/dist/domain/evaluate/preconditions.js.map +1 -0
- package/dist/domain/evaluate/quarantine.d.ts +15 -0
- package/dist/domain/evaluate/quarantine.d.ts.map +1 -0
- package/dist/domain/evaluate/quarantine.js +185 -0
- package/dist/domain/evaluate/quarantine.js.map +1 -0
- package/dist/domain/index.d.ts +7 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/model/constants.d.ts +73 -0
- package/dist/domain/model/constants.d.ts.map +1 -0
- package/dist/domain/model/constants.js +59 -0
- package/dist/domain/model/constants.js.map +1 -0
- package/dist/domain/model/index.d.ts +3 -0
- package/dist/domain/model/index.d.ts.map +1 -0
- package/dist/domain/model/index.js +2 -0
- package/dist/domain/model/index.js.map +1 -0
- package/dist/domain/model/types.d.ts +330 -0
- package/dist/domain/model/types.d.ts.map +1 -0
- package/dist/domain/model/types.js +8 -0
- package/dist/domain/model/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +3 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +3 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/storage/constants.d.ts +4 -0
- package/dist/infrastructure/storage/constants.d.ts.map +1 -0
- package/dist/infrastructure/storage/constants.js +4 -0
- package/dist/infrastructure/storage/constants.js.map +1 -0
- package/dist/infrastructure/storage/errors.d.ts +55 -0
- package/dist/infrastructure/storage/errors.d.ts.map +1 -0
- package/dist/infrastructure/storage/errors.js +58 -0
- package/dist/infrastructure/storage/errors.js.map +1 -0
- package/dist/infrastructure/storage/index.d.ts +23 -0
- package/dist/infrastructure/storage/index.d.ts.map +1 -0
- package/dist/infrastructure/storage/index.js +13 -0
- package/dist/infrastructure/storage/index.js.map +1 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts +64 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.d.ts.map +1 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.js +148 -0
- package/dist/infrastructure/storage/recovery/restoreRecovery.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts +49 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.js +529 -0
- package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts +5 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.js +2 -0
- package/dist/infrastructure/storage/sqlite/schemaTypes.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.d.ts +9 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.js +122 -0
- package/dist/infrastructure/storage/sqlite/sqlScript.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlState.d.ts +6 -0
- package/dist/infrastructure/storage/sqlite/sqlState.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlState.js +14 -0
- package/dist/infrastructure/storage/sqlite/sqlState.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts +6 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.js +24 -0
- package/dist/infrastructure/storage/sqlite/sqlTransaction.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts +44 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.js +66 -0
- package/dist/infrastructure/storage/sqlite/sqliteBridge.js.map +1 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts +101 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js +417 -0
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.d.ts +16 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.js +85 -0
- package/dist/infrastructure/storage/state/observation/observationAudit.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts +31 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.js +439 -0
- package/dist/infrastructure/storage/state/observation/observationCanonical.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.d.ts +53 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.js +41 -0
- package/dist/infrastructure/storage/state/observation/observationConstants.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.d.ts +49 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.js +537 -0
- package/dist/infrastructure/storage/state/observation/observationLedger.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts +15 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js +100 -0
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts +124 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.js +13 -0
- package/dist/infrastructure/storage/state/observation/observationTypes.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts +28 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.js +223 -0
- package/dist/infrastructure/storage/state/observation/observationValidation.js.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts +28 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.js +293 -0
- package/dist/infrastructure/storage/state/observation/observationWriter.js.map +1 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts +58 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js +195 -0
- package/dist/infrastructure/storage/state/readonly/readOnlyObservation.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts +31 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js +563 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts +118 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js +18 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts +23 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js +84 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts +16 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts.map +1 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js +97 -0
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +137 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +396 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts +101 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js +9 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +21 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +184 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts +25 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js +158 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js.map +1 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts +69 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.js +272 -0
- package/dist/infrastructure/storage/sync/shared/syncRegistry.js.map +1 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts +90 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts.map +1 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.js +282 -0
- package/dist/infrastructure/storage/sync/shared/writerLease.js.map +1 -0
- package/dist/shared/constants.d.ts +8 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +8 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/encoding/constants.d.ts +45 -0
- package/dist/shared/encoding/constants.d.ts.map +1 -0
- package/dist/shared/encoding/constants.js +37 -0
- package/dist/shared/encoding/constants.js.map +1 -0
- package/dist/shared/encoding/index.d.ts +6 -0
- package/dist/shared/encoding/index.d.ts.map +1 -0
- package/dist/shared/encoding/index.js +4 -0
- package/dist/shared/encoding/index.js.map +1 -0
- package/dist/shared/encoding/stableEncode.d.ts +34 -0
- package/dist/shared/encoding/stableEncode.d.ts.map +1 -0
- package/dist/shared/encoding/stableEncode.js +210 -0
- package/dist/shared/encoding/stableEncode.js.map +1 -0
- package/dist/shared/encoding/typeGuards.d.ts +15 -0
- package/dist/shared/encoding/typeGuards.d.ts.map +1 -0
- package/dist/shared/encoding/typeGuards.js +11 -0
- package/dist/shared/encoding/typeGuards.js.map +1 -0
- package/dist/shared/encoding/types.d.ts +52 -0
- package/dist/shared/encoding/types.d.ts.map +1 -0
- package/dist/shared/encoding/types.js +8 -0
- package/dist/shared/encoding/types.js.map +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +6 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/state/constants.d.ts +16 -0
- package/dist/shared/state/constants.d.ts.map +1 -0
- package/dist/shared/state/constants.js +16 -0
- package/dist/shared/state/constants.js.map +1 -0
- package/dist/shared/state/index.d.ts +3 -0
- package/dist/shared/state/index.d.ts.map +1 -0
- package/dist/shared/state/index.js +2 -0
- package/dist/shared/state/index.js.map +1 -0
- package/dist/shared/state/types.d.ts +23 -0
- package/dist/shared/state/types.d.ts.map +1 -0
- package/dist/shared/state/types.js +2 -0
- package/dist/shared/state/types.js.map +1 -0
- package/dist/shared/validation.d.ts +9 -0
- package/dist/shared/validation.d.ts.map +1 -0
- package/dist/shared/validation.js +25 -0
- package/dist/shared/validation.js.map +1 -0
- package/docs/architecture.md +72 -0
- package/docs/code-guidelines.md +256 -0
- package/docs/development.md +48 -0
- package/docs/git-workflow.md +224 -0
- package/docs/mikro-orm-adapter-spike.md +248 -0
- package/docs/quick-start.md +102 -0
- package/docs/sql-layer-plan.md +59 -0
- package/docs/sync-bulk-write-benchmark.md +1036 -0
- package/docs/sync-observability.md +71 -0
- package/docs/task-queue-write-model.md +640 -0
- package/docs/typed-sheets-mvp-scope-2026-06-29.md +490 -0
- package/docs/typed-sheets-plan.md +417 -0
- package/docs/write-and-synchronization-flow.md +71 -0
- package/package.json +68 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
# typed-sheets Plan
|
|
2
|
+
|
|
3
|
+
## 1. Project Positioning
|
|
4
|
+
|
|
5
|
+
`typed-sheets`는 Google Sheets를 초기 MVP, 내부 운영툴, 저트래픽 어드민, 프로토타입의 lightweight database처럼 사용할 때 필요한 TypeScript repository layer다.
|
|
6
|
+
|
|
7
|
+
핵심 포지션은 다음이다.
|
|
8
|
+
|
|
9
|
+
> Typed repository and safe write layer for Google Sheets-backed MVPs.
|
|
10
|
+
|
|
11
|
+
이 프로젝트는 Google Sheets를 MySQL/Postgres 대체재로 주장하지 않는다. 또한 `google-spreadsheet`나 `@googleapis/sheets` 같은 API client를 대체하려는 것도 아니다.
|
|
12
|
+
|
|
13
|
+
핵심 차별점은 Google Sheets를 DB처럼 쓸 때 조용히 깨지는 상태를 성공으로 처리하지 않는 것이다.
|
|
14
|
+
|
|
15
|
+
- Sheet header와 TypeScript schema의 drift 감지
|
|
16
|
+
- row 데이터를 typed object로 변환
|
|
17
|
+
- key column 기반 repository API 제공
|
|
18
|
+
- `_version` column 기반 optimistic locking
|
|
19
|
+
- Google Sheets API quota를 고려한 확장 가능한 구조
|
|
20
|
+
- 향후 Apps Script `LockService` write gateway 확장 가능성
|
|
21
|
+
|
|
22
|
+
## 2. Existing Ecosystem Comparison
|
|
23
|
+
|
|
24
|
+
### `google-spreadsheet`
|
|
25
|
+
|
|
26
|
+
- Google Sheets API를 편하게 다루기 위한 wrapper다.
|
|
27
|
+
- row/cell 조작은 편하지만 repository abstraction은 아니다.
|
|
28
|
+
- schema drift, key uniqueness, optimistic locking을 라이브러리의 중심 책임으로 보지 않는다.
|
|
29
|
+
|
|
30
|
+
`typed-sheets`에서는 이 라이브러리를 내부 adapter 구현체로 사용할 수 있다.
|
|
31
|
+
|
|
32
|
+
### `@googleapis/sheets`
|
|
33
|
+
|
|
34
|
+
- Google 공식 Sheets API client다.
|
|
35
|
+
- 저수준 API 호출, 인증, range read/write에 적합하다.
|
|
36
|
+
- typed repository, schema validation, stale write protection은 직접 구현해야 한다.
|
|
37
|
+
|
|
38
|
+
`typed-sheets`에서는 production adapter의 가장 보수적인 기반이 될 수 있다.
|
|
39
|
+
|
|
40
|
+
### `spreadsheet-orm`
|
|
41
|
+
|
|
42
|
+
- Google Spreadsheet를 ORM처럼 다루려는 비교적 가까운 시도다.
|
|
43
|
+
- query builder, schema management 등 ORM 방향의 기능을 포함한다.
|
|
44
|
+
- `typed-sheets`는 더 좁게 가는 것이 좋다.
|
|
45
|
+
|
|
46
|
+
`typed-sheets`의 MVP는 ORM 전체가 아니라 다음만 강하게 잡는다.
|
|
47
|
+
|
|
48
|
+
- header drift detection
|
|
49
|
+
- typed row parsing
|
|
50
|
+
- key-based repository
|
|
51
|
+
- `_version` optimistic locking
|
|
52
|
+
|
|
53
|
+
## 3. MVP API Review
|
|
54
|
+
|
|
55
|
+
제안된 MVP API는 크지 않다. 오히려 프로젝트의 차별점을 증명하기에 적절한 최소 범위다.
|
|
56
|
+
|
|
57
|
+
초기 API:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { createSheetRepository, text, number, boolean } from "typed-sheets";
|
|
61
|
+
|
|
62
|
+
const users = createSheetRepository({
|
|
63
|
+
sheetName: "Users",
|
|
64
|
+
key: "id",
|
|
65
|
+
columns: {
|
|
66
|
+
id: text(),
|
|
67
|
+
email: text(),
|
|
68
|
+
age: number().optional(),
|
|
69
|
+
active: boolean(),
|
|
70
|
+
_version: number(),
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
await users.assertSchema();
|
|
75
|
+
|
|
76
|
+
const all = await users.findAll();
|
|
77
|
+
const user = await users.findById("u1");
|
|
78
|
+
|
|
79
|
+
await users.insert({
|
|
80
|
+
id: "u1",
|
|
81
|
+
email: "a@test.com",
|
|
82
|
+
age: 20,
|
|
83
|
+
active: true,
|
|
84
|
+
_version: 1,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
await users.update("u1", current => ({
|
|
88
|
+
...current,
|
|
89
|
+
age: current.age + 1,
|
|
90
|
+
}));
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
단, 실제 구현에서는 `createSheetRepository`에 adapter를 명시적으로 주입하는 형태가 더 좋다.
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
const users = createSheetRepository({
|
|
97
|
+
adapter,
|
|
98
|
+
sheetName: "Users",
|
|
99
|
+
key: "id",
|
|
100
|
+
columns: {
|
|
101
|
+
id: text(),
|
|
102
|
+
email: text(),
|
|
103
|
+
age: number().optional(),
|
|
104
|
+
active: boolean(),
|
|
105
|
+
_version: number(),
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
이렇게 하면 core repository logic을 Google API, OAuth, network와 분리해 fake adapter로 테스트할 수 있다.
|
|
111
|
+
|
|
112
|
+
## 4. MVP Scope
|
|
113
|
+
|
|
114
|
+
MVP에 포함할 기능:
|
|
115
|
+
|
|
116
|
+
- schema definition API
|
|
117
|
+
- header 검증
|
|
118
|
+
- 필수 column 누락 감지
|
|
119
|
+
- 중복 header 감지
|
|
120
|
+
- key column 누락 감지
|
|
121
|
+
- row parsing
|
|
122
|
+
- string, number, boolean parser
|
|
123
|
+
- optional column
|
|
124
|
+
- `findAll`
|
|
125
|
+
- `findById`
|
|
126
|
+
- `insert`
|
|
127
|
+
- `update`
|
|
128
|
+
- `_version` 기반 optimistic locking
|
|
129
|
+
- `SchemaDriftError`
|
|
130
|
+
- `ConflictError`
|
|
131
|
+
- `ParseError`
|
|
132
|
+
- fake adapter 기반 테스트
|
|
133
|
+
|
|
134
|
+
MVP에서 제외할 기능:
|
|
135
|
+
|
|
136
|
+
- relation / join
|
|
137
|
+
- lazy loading
|
|
138
|
+
- SQL-like query language
|
|
139
|
+
- migration engine
|
|
140
|
+
- transaction manager
|
|
141
|
+
- multi-row atomic transaction
|
|
142
|
+
- Apps Script 자동 설치
|
|
143
|
+
- Apps Script Web App gateway
|
|
144
|
+
- cache
|
|
145
|
+
- request collapse
|
|
146
|
+
- retry/backoff
|
|
147
|
+
- browser support
|
|
148
|
+
- dashboard UI
|
|
149
|
+
|
|
150
|
+
## 5. Google Sheets를 DB처럼 쓸 때의 한계
|
|
151
|
+
|
|
152
|
+
Google Sheets는 spreadsheet이지 database가 아니다. 따라서 다음 한계를 명확히 문서화해야 한다.
|
|
153
|
+
|
|
154
|
+
- storage layer에 primary key / unique constraint가 없다.
|
|
155
|
+
- multi-row transaction이 없다.
|
|
156
|
+
- 여러 사용자가 동시에 수정할 때 lost update가 발생할 수 있다.
|
|
157
|
+
- 비개발자가 header를 변경하거나 삭제할 수 있다.
|
|
158
|
+
- 값 타입이 느슨해서 string, number, boolean, date가 섞일 수 있다.
|
|
159
|
+
- formula, formatted value, raw value가 다를 수 있다.
|
|
160
|
+
- 전체 row scan이 커질수록 느려지고 quota를 많이 쓴다.
|
|
161
|
+
- Google Sheets API quota와 timeout에 영향을 받는다.
|
|
162
|
+
- Google OAuth, service account, 공유 권한 설정이 운영 변수가 된다.
|
|
163
|
+
- Apps Script를 붙이면 OAuth 승인, Workspace 정책, script quota, 배포 문제가 추가된다.
|
|
164
|
+
|
|
165
|
+
따라서 이 프로젝트는 다음 사용처에만 적합하다고 명확히 제한해야 한다.
|
|
166
|
+
|
|
167
|
+
- 초기 MVP
|
|
168
|
+
- 내부 운영툴
|
|
169
|
+
- 저트래픽 어드민
|
|
170
|
+
- 비개발자가 직접 수정하는 운영 데이터
|
|
171
|
+
- 프로토타입
|
|
172
|
+
|
|
173
|
+
## 6. Domain / Application / Adapter 분리 구조
|
|
174
|
+
|
|
175
|
+
권장 구조:
|
|
176
|
+
|
|
177
|
+
```txt
|
|
178
|
+
src/
|
|
179
|
+
index.ts
|
|
180
|
+
domain/ # 정규화, 평가, 충돌, 상태 규칙
|
|
181
|
+
shared/ # 공통 상수·인코딩·상태 계약
|
|
182
|
+
application/
|
|
183
|
+
orm/ # 사용자 ORM facade와 mapping/flush
|
|
184
|
+
sync/ # gateway, worker, reconciliation
|
|
185
|
+
adapter/ # persistence와 Sheets provider 계약/구현
|
|
186
|
+
infrastructure/
|
|
187
|
+
storage/ # SQLite schema, canonical state, outbox
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Domain 책임
|
|
191
|
+
|
|
192
|
+
`domain`은 Google API와 SQLite 구현을 몰라야 한다.
|
|
193
|
+
|
|
194
|
+
책임:
|
|
195
|
+
|
|
196
|
+
- schema definition 해석
|
|
197
|
+
- header validation
|
|
198
|
+
- duplicate header detection
|
|
199
|
+
- required column validation
|
|
200
|
+
- key column validation
|
|
201
|
+
- row parsing
|
|
202
|
+
- duplicate key detection
|
|
203
|
+
- repository method 구현
|
|
204
|
+
- `_version` optimistic locking
|
|
205
|
+
- typed error throw
|
|
206
|
+
|
|
207
|
+
### Application 책임
|
|
208
|
+
|
|
209
|
+
application은 domain 규칙과 adapter/infrastructure를 조율한다.
|
|
210
|
+
|
|
211
|
+
책임:
|
|
212
|
+
|
|
213
|
+
- ORM entity lifecycle과 flush 계획
|
|
214
|
+
- effect worker와 reconciliation 실행
|
|
215
|
+
- Apps Script gateway operation 조합
|
|
216
|
+
|
|
217
|
+
### Adapter 책임
|
|
218
|
+
|
|
219
|
+
adapter는 Google Sheets와 통신하는 부분만 담당한다.
|
|
220
|
+
|
|
221
|
+
책임:
|
|
222
|
+
|
|
223
|
+
- 인증
|
|
224
|
+
- spreadsheet 접근
|
|
225
|
+
- sheet 조회
|
|
226
|
+
- range read/write
|
|
227
|
+
- append row
|
|
228
|
+
- update row
|
|
229
|
+
- batch API 사용 여부
|
|
230
|
+
- retry/backoff
|
|
231
|
+
- cache/request collapse
|
|
232
|
+
- Apps Script gateway 호출
|
|
233
|
+
|
|
234
|
+
초기 adapter port 예시:
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
export type SheetCell = string | number | boolean | null;
|
|
238
|
+
|
|
239
|
+
export interface SheetSnapshot {
|
|
240
|
+
headers: string[];
|
|
241
|
+
rows: SheetCell[][];
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export interface SheetAdapter {
|
|
245
|
+
readSheet(sheetName: string): Promise<SheetSnapshot>;
|
|
246
|
+
appendRow(sheetName: string, row: SheetCell[]): Promise<void>;
|
|
247
|
+
updateRow(sheetName: string, rowNumber: number, row: SheetCell[]): Promise<void>;
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
`rowNumber`는 Google Sheet 기준 1-based row number로 둔다. header가 1행이므로 data row는 2행부터 시작한다.
|
|
252
|
+
|
|
253
|
+
## 7. Optimistic Locking 설계
|
|
254
|
+
|
|
255
|
+
`_version` column은 MVP에서 필수로 두는 것이 좋다.
|
|
256
|
+
|
|
257
|
+
기본 흐름:
|
|
258
|
+
|
|
259
|
+
1. `update(id, updater)` 호출
|
|
260
|
+
2. sheet를 읽는다.
|
|
261
|
+
3. key column으로 row를 찾는다.
|
|
262
|
+
4. 현재 `_version`을 기억한다.
|
|
263
|
+
5. updater를 적용한다.
|
|
264
|
+
6. write 직전 같은 row를 다시 읽거나 adapter-level compare-and-set을 수행한다.
|
|
265
|
+
7. version이 바뀌었으면 `ConflictError`를 던진다.
|
|
266
|
+
8. version이 같으면 `_version + 1`로 write한다.
|
|
267
|
+
|
|
268
|
+
MVP fake adapter에서는 read-between-write 시나리오를 테스트할 수 있게 만들어 stale write를 증명한다.
|
|
269
|
+
|
|
270
|
+
실제 Google Sheets API만으로는 완전한 atomic compare-and-set이 어렵다. 따라서 MVP에서는 stale write risk를 줄이는 repository-level fencing으로 시작하고, 2차 확장에서 Apps Script `LockService` 기반 serialized write gateway로 강화한다.
|
|
271
|
+
|
|
272
|
+
## 8. Error 설계
|
|
273
|
+
|
|
274
|
+
### `SchemaDriftError`
|
|
275
|
+
|
|
276
|
+
다음 상황에서 발생:
|
|
277
|
+
|
|
278
|
+
- header 중복
|
|
279
|
+
- required column 누락
|
|
280
|
+
- key column 누락
|
|
281
|
+
- `_version` column 누락
|
|
282
|
+
- duplicate key 발견
|
|
283
|
+
|
|
284
|
+
### `ParseError`
|
|
285
|
+
|
|
286
|
+
다음 상황에서 발생:
|
|
287
|
+
|
|
288
|
+
- required value가 비어 있음
|
|
289
|
+
- number parser 실패
|
|
290
|
+
- boolean parser 실패
|
|
291
|
+
- `_version` 값이 number가 아님
|
|
292
|
+
|
|
293
|
+
### `ConflictError`
|
|
294
|
+
|
|
295
|
+
다음 상황에서 발생:
|
|
296
|
+
|
|
297
|
+
- update 중 `_version`이 변경됨
|
|
298
|
+
- stale row write가 감지됨
|
|
299
|
+
|
|
300
|
+
## 9. Test Scenarios
|
|
301
|
+
|
|
302
|
+
테스트는 실제 Google API 없이 fake adapter로 먼저 작성한다.
|
|
303
|
+
|
|
304
|
+
### Schema tests
|
|
305
|
+
|
|
306
|
+
- `assertSchema`는 모든 column이 있으면 성공한다.
|
|
307
|
+
- required column이 없으면 `SchemaDriftError`를 던진다.
|
|
308
|
+
- key column이 없으면 `SchemaDriftError`를 던진다.
|
|
309
|
+
- `_version` column이 없으면 `SchemaDriftError`를 던진다.
|
|
310
|
+
- duplicate header가 있으면 `SchemaDriftError`를 던진다.
|
|
311
|
+
|
|
312
|
+
### Parsing tests
|
|
313
|
+
|
|
314
|
+
- text column을 string으로 파싱한다.
|
|
315
|
+
- number column을 number로 파싱한다.
|
|
316
|
+
- boolean column을 boolean으로 파싱한다.
|
|
317
|
+
- optional column은 empty value를 `undefined`로 파싱한다.
|
|
318
|
+
- required column이 비어 있으면 `ParseError`를 던진다.
|
|
319
|
+
- number 변환에 실패하면 `ParseError`를 던진다.
|
|
320
|
+
- boolean 변환에 실패하면 `ParseError`를 던진다.
|
|
321
|
+
|
|
322
|
+
### Repository read tests
|
|
323
|
+
|
|
324
|
+
- `findAll`은 typed object 배열을 반환한다.
|
|
325
|
+
- `findById`는 key가 일치하는 row를 반환한다.
|
|
326
|
+
- `findById`는 없으면 `null`을 반환한다.
|
|
327
|
+
- duplicate key가 있으면 `SchemaDriftError`를 던진다.
|
|
328
|
+
|
|
329
|
+
### Insert tests
|
|
330
|
+
|
|
331
|
+
- `insert`는 header 순서대로 row를 append한다.
|
|
332
|
+
- duplicate key insert는 `SchemaDriftError` 또는 별도 duplicate key error를 던진다.
|
|
333
|
+
- insert row parse/serialization 실패를 테스트한다.
|
|
334
|
+
|
|
335
|
+
### Update tests
|
|
336
|
+
|
|
337
|
+
- `update`는 현재 row를 updater에 넘긴다.
|
|
338
|
+
- `update`는 `_version`을 1 증가시킨다.
|
|
339
|
+
- `update`는 header 순서대로 row를 write한다.
|
|
340
|
+
- target row가 없으면 `null`을 반환한다.
|
|
341
|
+
- write 전 version이 바뀌면 `ConflictError`를 던진다.
|
|
342
|
+
|
|
343
|
+
## 10. Implementation Order
|
|
344
|
+
|
|
345
|
+
권장 구현 순서:
|
|
346
|
+
|
|
347
|
+
1. `package.json`, `tsconfig`, test runner 설정
|
|
348
|
+
2. `SheetAdapter` interface 정의
|
|
349
|
+
3. error class 정의
|
|
350
|
+
4. column schema primitive 구현
|
|
351
|
+
5. schema validation 구현
|
|
352
|
+
6. row parsing 구현
|
|
353
|
+
7. `findAll`, `findById` 구현
|
|
354
|
+
8. `insert` 구현
|
|
355
|
+
9. `_version` 기반 `update` 구현
|
|
356
|
+
10. fake adapter 테스트 작성
|
|
357
|
+
11. README 정리
|
|
358
|
+
12. 실제 Google Sheets adapter는 MVP core 검증 후 별도 단계로 진행
|
|
359
|
+
|
|
360
|
+
## 11. Expected MVP Size
|
|
361
|
+
|
|
362
|
+
목표 규모:
|
|
363
|
+
|
|
364
|
+
- production TypeScript: 500~900 lines
|
|
365
|
+
- tests: 700~1,200 lines
|
|
366
|
+
- README/docs/config: 400~700 lines
|
|
367
|
+
- total MVP: 1,500~2,800 lines
|
|
368
|
+
|
|
369
|
+
핵심은 기능 수가 아니라 다음을 테스트로 증명하는 것이다.
|
|
370
|
+
|
|
371
|
+
- schema drift를 조용히 통과시키지 않는다.
|
|
372
|
+
- parse failure를 조용히 통과시키지 않는다.
|
|
373
|
+
- duplicate key를 조용히 통과시키지 않는다.
|
|
374
|
+
- stale write를 조용히 통과시키지 않는다.
|
|
375
|
+
|
|
376
|
+
## 12. Later Extensions
|
|
377
|
+
|
|
378
|
+
MVP 이후 후보:
|
|
379
|
+
|
|
380
|
+
1. read cache / request collapse
|
|
381
|
+
2. timeout / retry / exponential backoff
|
|
382
|
+
3. `@googleapis/sheets` adapter
|
|
383
|
+
4. `google-spreadsheet` adapter
|
|
384
|
+
5. Apps Script 자동 설치 CLI
|
|
385
|
+
6. Apps Script `LockService` 기반 serialized write gateway
|
|
386
|
+
7. schema drift report
|
|
387
|
+
8. GitHub Action
|
|
388
|
+
9. Google Sheet template generator
|
|
389
|
+
10. `_createdAt`, `_updatedAt` system columns
|
|
390
|
+
11. soft delete
|
|
391
|
+
12. audit log sheet
|
|
392
|
+
|
|
393
|
+
## 13. Apps Script 방향
|
|
394
|
+
|
|
395
|
+
향후 CLI 예시:
|
|
396
|
+
|
|
397
|
+
```sh
|
|
398
|
+
npx typed-sheets init --spreadsheet-id xxx
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
목표:
|
|
402
|
+
|
|
403
|
+
- Google OAuth 로그인
|
|
404
|
+
- 대상 spreadsheet 확인
|
|
405
|
+
- bound Apps Script project 생성
|
|
406
|
+
- Apps Script 코드 업로드
|
|
407
|
+
- `LockService` 기반 write function 설치
|
|
408
|
+
- 설치 검증
|
|
409
|
+
|
|
410
|
+
가능한 공식 API 흐름:
|
|
411
|
+
|
|
412
|
+
- `projects.create`
|
|
413
|
+
- `projects.updateContent`
|
|
414
|
+
- spreadsheet file id를 parent로 사용해 bound script 생성
|
|
415
|
+
- 필요한 경우 installable trigger 생성
|
|
416
|
+
|
|
417
|
+
MVP에는 포함하지 않는다. OAuth, Workspace 정책, 권한 승인, Apps Script API 활성화 문제 때문에 core 안정성을 먼저 증명한 뒤 진행한다.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Write and Synchronization Flow
|
|
2
|
+
|
|
3
|
+
Hikoutei commits local state first and materializes Google Sheets changes
|
|
4
|
+
asynchronously.
|
|
5
|
+
|
|
6
|
+
## Outbound flow: SQLite to Google Sheets
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
em.persist(entity) / em.remove(entity)
|
|
10
|
+
│
|
|
11
|
+
▼
|
|
12
|
+
SQLite transaction
|
|
13
|
+
├─ canonical entity state
|
|
14
|
+
└─ durable outbox effect
|
|
15
|
+
│
|
|
16
|
+
▼
|
|
17
|
+
background effect worker
|
|
18
|
+
├─ claim with a lease
|
|
19
|
+
├─ send a signed operation batch
|
|
20
|
+
├─ retry or recover an uncertain response
|
|
21
|
+
└─ mark the effect applied/failed
|
|
22
|
+
│
|
|
23
|
+
▼
|
|
24
|
+
Apps Script gateway ── fast range write ──▶ Google Sheets
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The application request does not wait for the remote Sheet write. A successful
|
|
28
|
+
`flush()` means that SQLite accepted the entity change and the corresponding
|
|
29
|
+
effect was durably queued.
|
|
30
|
+
|
|
31
|
+
## Fast append
|
|
32
|
+
|
|
33
|
+
The common system-state append path favors one contiguous range write. It avoids
|
|
34
|
+
doing expensive metadata, snapshot, postcondition, and repair work before every
|
|
35
|
+
append. Those checks belong to a separate safety path so the common write can
|
|
36
|
+
remain small and predictable.
|
|
37
|
+
|
|
38
|
+
## Update and delete
|
|
39
|
+
|
|
40
|
+
Update and delete effects are still represented as durable outbox work and are
|
|
41
|
+
sent by the same worker. Their safety policy can be stricter than append because
|
|
42
|
+
overwriting or removing an existing row has a larger failure impact.
|
|
43
|
+
|
|
44
|
+
## Gateway boundary
|
|
45
|
+
|
|
46
|
+
The Apps Script gateway is intentionally thin:
|
|
47
|
+
|
|
48
|
+
1. verify the signed operation envelope
|
|
49
|
+
2. validate the operation contract
|
|
50
|
+
3. execute the allowlisted Sheet operation
|
|
51
|
+
4. return a structured result to the server worker
|
|
52
|
+
|
|
53
|
+
Entity evaluation, canonical state, retry policy, reconciliation, and effect
|
|
54
|
+
classification remain in the Node/SQLite side of Hikoutei.
|
|
55
|
+
|
|
56
|
+
## Uncertain remote results
|
|
57
|
+
|
|
58
|
+
An HTTP timeout or lost response does not prove that the Sheet write failed. The
|
|
59
|
+
worker treats that result as recoverable work, retries according to its policy,
|
|
60
|
+
and relies on idempotent effects and reconciliation to repair drift later.
|
|
61
|
+
|
|
62
|
+
The design therefore favors at-least-once delivery with a repair safety net over
|
|
63
|
+
trying to prove exactly-once behavior from a response that may never arrive.
|
|
64
|
+
|
|
65
|
+
## Inbound path: user edits
|
|
66
|
+
|
|
67
|
+
User-owned Sheet changes are a separate inbound concern. A future or configured
|
|
68
|
+
`onEdit`/lightweight polling path reads the user-editable values, compares them
|
|
69
|
+
with SQLite state, and sends the resulting observation into the evaluation and
|
|
70
|
+
conflict pipeline. This path is intentionally separate from the fast outbound
|
|
71
|
+
append path.
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hikoutei",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Hikoutei — typed repository and safe write layer for Google Sheets-backed MVPs.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/ManddarinShop/Hikoutei.git"
|
|
8
|
+
},
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/ManddarinShop/Hikoutei/issues"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/ManddarinShop/Hikoutei#readme",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./orm": {
|
|
22
|
+
"types": "./dist/application/orm/index.d.ts",
|
|
23
|
+
"import": "./dist/application/orm/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./mikro-orm": {
|
|
26
|
+
"types": "./dist/adapter/persistence/providers/mikro-orm/index.d.ts",
|
|
27
|
+
"import": "./dist/adapter/persistence/providers/mikro-orm/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"docs",
|
|
33
|
+
"apps-script/gateway/Code.gs"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"clean": "node scripts/clean-dist.mjs",
|
|
37
|
+
"build": "npm run clean && tsc -p tsconfig.json",
|
|
38
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
39
|
+
"typecheck:test": "tsc -p tsconfig.test.json",
|
|
40
|
+
"test": "vitest run test/*.test.ts"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"google-sheets",
|
|
44
|
+
"typescript",
|
|
45
|
+
"repository",
|
|
46
|
+
"optimistic-locking"
|
|
47
|
+
],
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@mikro-orm/core": "7.1.7",
|
|
51
|
+
"@mikro-orm/sql": "7.1.7",
|
|
52
|
+
"@types/node": "^20.14.10",
|
|
53
|
+
"typescript": "^5.5.3",
|
|
54
|
+
"vitest": "^1.6.0"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@mikro-orm/core": "7.1.7",
|
|
58
|
+
"@mikro-orm/sql": "7.1.7"
|
|
59
|
+
},
|
|
60
|
+
"peerDependenciesMeta": {
|
|
61
|
+
"@mikro-orm/core": {
|
|
62
|
+
"optional": true
|
|
63
|
+
},
|
|
64
|
+
"@mikro-orm/sql": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|