@tiangong-lca/cli 0.0.11 → 0.0.13
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/README.md +18 -7
- package/assets/tidas-schemas/tidas_contacts.json +312 -0
- package/assets/tidas-schemas/tidas_contacts_category.json +126 -0
- package/assets/tidas-schemas/tidas_data_types.json +359 -0
- package/assets/tidas-schemas/tidas_flowproperties.json +303 -0
- package/assets/tidas-schemas/tidas_flowproperties_category.json +61 -0
- package/assets/tidas-schemas/tidas_flows.json +809 -0
- package/assets/tidas-schemas/tidas_flows_elementary_category.json +720 -0
- package/assets/tidas-schemas/tidas_flows_product_category.json +59623 -0
- package/assets/tidas-schemas/tidas_lciamethods.json +1326 -0
- package/assets/tidas-schemas/tidas_lciamethods_category.json +685 -0
- package/assets/tidas-schemas/tidas_lifecyclemodels.json +1374 -0
- package/assets/tidas-schemas/tidas_locations_category.json +2593 -0
- package/assets/tidas-schemas/tidas_processes.json +1646 -0
- package/assets/tidas-schemas/tidas_processes_category.json +10795 -0
- package/assets/tidas-schemas/tidas_sources.json +228 -0
- package/assets/tidas-schemas/tidas_sources_category.json +100 -0
- package/assets/tidas-schemas/tidas_unitgroups.json +338 -0
- package/assets/tidas-schemas/tidas_unitgroups_category.json +61 -0
- package/dist/src/cli.js +847 -13
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-classification.js +947 -0
- package/dist/src/lib/dataset-classification.js.map +1 -0
- package/dist/src/lib/dataset-command.js +11 -0
- package/dist/src/lib/dataset-command.js.map +1 -1
- package/dist/src/lib/dataset-contract.js +2 -0
- package/dist/src/lib/dataset-contract.js.map +1 -1
- package/dist/src/lib/dataset-curation-queue.js +359 -2
- package/dist/src/lib/dataset-curation-queue.js.map +1 -1
- package/dist/src/lib/dataset-import-lca.js +18 -0
- package/dist/src/lib/dataset-import-lca.js.map +1 -1
- package/dist/src/lib/dataset-local.js +94 -1
- package/dist/src/lib/dataset-local.js.map +1 -1
- package/dist/src/lib/dataset-maintenance-clear-account.js +506 -0
- package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -0
- package/dist/src/lib/dataset-patch.js +797 -0
- package/dist/src/lib/dataset-patch.js.map +1 -0
- package/dist/src/lib/dataset-remote-verify.js +188 -3
- package/dist/src/lib/dataset-remote-verify.js.map +1 -1
- package/dist/src/lib/dataset-save-draft-run.js +725 -0
- package/dist/src/lib/dataset-save-draft-run.js.map +1 -0
- package/dist/src/lib/dataset-validate.js +32 -2
- package/dist/src/lib/dataset-validate.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +7 -2
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/flow-qa.js +8 -0
- package/dist/src/lib/flow-qa.js.map +1 -1
- package/dist/src/lib/identity-preflight.js +895 -117
- package/dist/src/lib/identity-preflight.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-qa.js +159 -34
- package/dist/src/lib/lifecyclemodel-qa.js.map +1 -1
- package/dist/src/lib/process-required-fields.js +62 -12
- package/dist/src/lib/process-required-fields.js.map +1 -1
- package/dist/src/lib/process-save-draft-run.js +10 -0
- package/dist/src/lib/process-save-draft-run.js.map +1 -1
- package/dist/src/lib/process-save-draft.js +59 -3
- package/dist/src/lib/process-save-draft.js.map +1 -1
- package/dist/src/lib/supabase-client.js +19 -8
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-curation-queue.js","sourceRoot":"","sources":["../../../src/lib/dataset-curation-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,aAAa,EACb,QAAQ,EACR,sBAAsB,GAGvB,MAAM,oBAAoB,CAAC;AAyF5B,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAA4C;IAE5C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/F,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAClE,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAC5C,CAAC;IACF,MAAM,oBAAoB,GAAG,CAAC,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAClF,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,CAAC,CACtD,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7F,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,WAAW,GAAG,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;SACxD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SAChD,KAAK,CAAC,CAAC,EAAE,YAAY,IAAI,SAAS,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAClE,oBAAoB,CAAC,SAAS,CAAC,CAChC,CAAC;IAEF,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9D,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAkC,EAAE,CAAC;IACnD,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,WAAW,GAAc,EAAE,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,MAAM,EAAE,CAAC;gBACX,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC;gBACZ,cAAc,EAAE,CAAC;gBACjB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,SAAS;gBACnB,WAAW,EAAE,SAAS;gBACtB,SAAS,EAAE,GAAG,CAAC,EAAE;gBACjB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EACL,0GAA0G;gBAC5G,OAAO,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,EAAE,GAAG,YAAY,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG;QACf,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;KACzE,CAAC;IAEF,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;QACrC,oBAAoB,CAAC;YACnB,GAAG;YACH,IAAI;YACJ,QAAQ,EAAE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;YACjF,eAAe;YACf,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,+BAA+B,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,gBAAgB,CAAC;QACnC,aAAa;QACb,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,YAAY;QACf,GAAG,oBAAoB;KACxB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG;QACZ,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC1C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,MAAM,GAAoC;QAC9C,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACjD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7B,MAAM,EAAE;YACN,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YACtC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;YACjD,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACjE,kBAAkB,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SACrF;QACD,MAAM,EAAE;YACN,YAAY,EAAE,WAAW,CAAC,MAAM;YAChC,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,YAAY,EAAE,WAAW,CAAC,MAAM;YAChC,kBAAkB,EAAE,gBAAgB,CAAC,MAAM;YAC3C,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM;SAC1B;QACD,MAAM,EAAE;YACN,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACjE;QACD,KAAK,EAAE;YACL,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,YAAY;SACvB;QACD,KAAK;QACL,QAAQ;KACT,CAAC;IAEF,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5B,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,UAA0C;IAClF,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,sBAAsB,CAC7B,SAAiB,EACjB,UAA0C,EAC1C,GAAoB;IAEpB,MAAM,aAAa,GAAG,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;IACjG,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,QAAQ,CAChB,GAAG,UAAU,kCAAkC,SAAS,aAAa,GAAG,CAAC,KAAK,GAAG,EACjF;YACE,IAAI,EAAE,+BAA+B;YACrC,QAAQ,EAAE,CAAC;SACZ,CACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,UAAU;QACV,UAAU,EAAE,SAAS;QACrB,WAAW,EAAE,GAAG,CAAC,KAAK;QACtB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,EAAE;QACF,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,eAAe;KAC/F,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAmB;IAItD,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CACjE,CAAC;IACF,MAAM,kBAAkB,GACtB,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,kBAAkB,CAAC;QAC/D,CAAC,CAAC,WAAW,CAAC,kBAAkB;QAChC,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,yBAAyB,GAAG,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC,yBAAyB;QAChC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,uBAAuB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,uBAAuB,CAAC;QACzF,CAAC,CAAC,yBAAyB,CAAC,uBAAuB;QACnD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,EAAE,EAAE,aAAa,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACpD,OAAO,EAAE,aAAa,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAmB;IAClD,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,GAAa,EAAE,SAAmB;IACnE,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,MAAM,EACN,UAAU,EACV,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAC/B,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CACnC,CAAC;IACF,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,WAAW,EAAE,GAAG,CAAC,UAAU;QAC3B,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,GAAG,CAAC,EAAE;QACjB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,SAAS;QACrB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;QAClD,QAAQ,EAAE,OAAO;QACjB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACtD,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC;QACzD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAM7B;IACC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE;QACnC,cAAc,EAAE,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QACnC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;QACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QAC5B,MAAM,EAAE;YACN,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAC1C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;SAC/B;QACD,YAAY,EAAE,sBAAsB,CAAC,OAAO,CAAC;KAC9C,CAAC,CAAC;IACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,sBAAsB,CAAC,OAM/B;IACC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO;YACL,WAAW,EAAE,EAAE;YACf,aAAa,EAAE,EAAE;YACjB,eAAe,EAAE,EAAE;SACpB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,QAAQ;aAC1B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aAC9D,MAAM,CAAC,CAAC,IAAI,EAA2C,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC5E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACtB,WAAW,EAAE,MAAM;YACnB,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC;YAC/C,QAAQ,EAAE,GAAG,CAAC,IAAI;SACnB,CAAC,CAAC;QACL,aAAa,EAAE,OAAO,CAAC,QAAQ;aAC5B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aACzF,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,WAAW,EAAE,MAAM;YACnB,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,IAAI;SACnB,CAAC,CAAC;QACL,eAAe,EAAE,OAAO,CAAC,QAAQ;aAC9B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aAC1F,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,WAAW,EAAE,MAAM;YACnB,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,IAAI;SACnB,CAAC,CAAC;KACN,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAA8B;IAClD,MAAM,YAAY,GAAqD;QACrE,OAAO,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,CAAC;QAC9D,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC;QAC7D,OAAO,EAAE;YACP,oBAAoB;YACpB,mBAAmB;YACnB,iBAAiB;YACjB,QAAQ;YACR,IAAI;YACJ,UAAU;YACV,gBAAgB;YAChB,UAAU;SACX;KACF,CAAC;IACF,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrD,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,KAAK,OAAO,CAAC;SAC1E,CAAC,CAAC;QACH,mBAAmB,EAAE;YACnB,WAAW,EAAE,gCAAgC;YAC7C,4BAA4B,EAAE,IAAI;YAClC,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IACxC,eAAe,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,SAAmB,EAAE,IAA0B;IACtF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,gBAAgB,GACpB,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC1C,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACnC,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,aAAa,CACtB,KAAK,CAAC,cAAc,CAAC,EACrB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,aAAa,CAAC,CACrB,CAAC;QACF,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,OAAO,GAAG,aAAa,CAC3B,KAAK,CAAC,UAAU,CAAC,EACjB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,uBAAuB,CAAC,CAC/B,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE;gBAC5C,EAAE;gBACF,OAAO;gBACP,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,eAAe,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/E,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,QAAQ,CAAC,sCAAsC,SAAS,aAAa,GAAG,CAAC,KAAK,GAAG,EAAE;gBAC3F,IAAI,EAAE,6CAA6C;gBACnD,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,EAAE;YACF,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YAC5D,IAAI,EAAE,GAAG,SAAS,IAAI,GAAG,CAAC,KAAK,EAAE;SAClC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAyB;IACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,QAAQ,CAAC,6CAA6C,EAAE;YAChE,IAAI,EAAE,sCAAsC;YAC5C,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB,EAAE,IAAY;IAC1D,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,eAAe,EAAE;YACzC,IAAI,EAAE,sCAAsC;YAC5C,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB,EAAE,IAAY;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,yBAAyB,SAAS,EAAE,EAAE;YAC9D,IAAI,EAAE,gCAAgC;YACtC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,UAA0C;IACjE,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/F,CAAC;AAED,SAAS,aAAa,CAAC,EAAU,EAAE,OAAe;IAChD,OAAO,GAAG,iBAAiB,CAAC,EAAE,CAAC,KAAK,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,SAAS,CAChB,UAA0C,EAC1C,EAAU,EACV,OAAe;IAEf,OAAO,GAAG,UAAU,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AACxF,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAoB;IAC5C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,KAAsB;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,KAAc;IACjD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,KAAa;IAChD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,IAAe;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sBAAsB;CACvB,CAAC","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport {\n firstNonEmpty,\n isRecord,\n materializeDatasetRows,\n type DatasetRowInput,\n type JsonObject,\n} from './dataset-local.js';\n\nexport type DatasetCurationQueueEntityType = 'support' | 'flow' | 'process';\n\nexport type RunDatasetCurationQueueBuildOptions = {\n processesPath: string;\n flowsPath?: string;\n supportPaths?: string[];\n externalFlowRefPaths?: string[];\n outDir: string;\n excludeProcessIds?: string[];\n processLimit?: number;\n};\n\nexport type DatasetCurationQueueTask = {\n schema_version: 1;\n entity_type: DatasetCurationQueueEntityType;\n task_id: string;\n entity_id: string;\n version: string;\n lock_key: string;\n depends_on: string[];\n input_rows_file: string;\n work_dir: string;\n checkpoint_file: string;\n run_plan_file: string;\n closure_file: string;\n};\n\ntype DatasetCurationQueueBlocker = {\n schema_version: 1;\n code: string;\n severity: 'blocker';\n entity_type: DatasetCurationQueueEntityType;\n entity_id: string | null;\n version: string | null;\n message: string;\n details?: unknown;\n};\n\nexport type DatasetCurationQueueBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'ready' | 'blocked';\n out_dir: string;\n inputs: {\n processes: string;\n flows: string | null;\n support: string[];\n external_flow_refs: string[];\n };\n counts: {\n support_rows: number;\n flow_rows: number;\n process_rows: number;\n external_flow_refs: number;\n tasks: number;\n blockers: number;\n };\n hashes: {\n inputs: Record<string, string>;\n task_order: string;\n };\n files: {\n manifest: string;\n tasks: string;\n locks: string;\n blockers: string;\n };\n tasks: DatasetCurationQueueTask[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\ntype QueueRow = {\n entityType: DatasetCurationQueueEntityType;\n sourcePath: string;\n sourceIndex: number;\n row: JsonObject;\n payload: JsonObject;\n id: string;\n version: string;\n};\n\ntype FlowRef = {\n id: string;\n version: string | null;\n path: string;\n};\n\nconst DEFAULT_VERSION = 'unversioned';\n\nexport async function runDatasetCurationQueueBuild(\n options: RunDatasetCurationQueueBuildOptions,\n): Promise<DatasetCurationQueueBuildReport> {\n const outDir = requirePath(options.outDir, '--out-dir');\n const processesPath = requireExistingPath(options.processesPath, '--processes');\n const flowsPath = options.flowsPath ? requireExistingPath(options.flowsPath, '--flows') : null;\n const supportPaths = (options.supportPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--support'),\n );\n const externalFlowRefPaths = (options.externalFlowRefPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--external-flow-ref'),\n );\n const processLimit = normalizeProcessLimit(options.processLimit);\n const excludedProcessIds = new Set((options.excludeProcessIds ?? []).map((id) => id.trim()));\n\n const supportRows = supportPaths.flatMap((inputPath) => readQueueRows(inputPath, 'support'));\n const flowRows = flowsPath ? readQueueRows(flowsPath, 'flow') : [];\n const processRows = readQueueRows(processesPath, 'process')\n .filter((row) => !excludedProcessIds.has(row.id))\n .slice(0, processLimit ?? undefined);\n const externalFlowRefs = externalFlowRefPaths.flatMap((inputPath) =>\n readExternalFlowRefs(inputPath),\n );\n\n mkdirSync(outDir, { recursive: true });\n\n const localFlowTasks = new Map<string, string>();\n const flowRowsById = new Map<string, QueueRow>();\n for (const row of flowRows) {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n localFlowTasks.set(row.id, taskId);\n flowRowsById.set(row.id, row);\n }\n\n const externalFlowIds = new Set(externalFlowRefs.map((ref) => ref.id));\n const blockers: DatasetCurationQueueBlocker[] = [];\n const supportTasks = supportRows.map((row) => buildTask(outDir, row, []));\n const flowTasks = flowRows.map((row) => buildTask(outDir, row, []));\n const processTasks = processRows.map((row) => {\n const refs = extractProcessFlowRefs(row.payload);\n const dependsOn = new Set<string>();\n const missingRefs: FlowRef[] = [];\n for (const ref of refs) {\n const taskId = localFlowTasks.get(ref.id);\n if (taskId) {\n dependsOn.add(taskId);\n } else if (!externalFlowIds.has(ref.id)) {\n missingRefs.push(ref);\n }\n }\n if (missingRefs.length > 0) {\n blockers.push({\n schema_version: 1,\n code: 'process_flow_reference_unresolved',\n severity: 'blocker',\n entity_type: 'process',\n entity_id: row.id,\n version: row.version,\n message:\n 'Process references flows that are neither present in local flow rows nor declared as external flow refs.',\n details: { missing_flow_refs: missingRefs },\n });\n }\n return buildTask(outDir, row, [...dependsOn].sort());\n });\n const tasks = [...supportTasks, ...flowTasks, ...processTasks];\n const taskRows = [\n ...supportRows.map((row, index) => ({ row, task: supportTasks[index] })),\n ...flowRows.map((row, index) => ({ row, task: flowTasks[index] })),\n ...processRows.map((row, index) => ({ row, task: processTasks[index] })),\n ];\n\n for (const { row, task } of taskRows) {\n writeEntityArtifacts({\n row,\n task,\n flowRefs: row.entityType === 'process' ? extractProcessFlowRefs(row.payload) : [],\n externalFlowIds,\n flowRowsById,\n });\n }\n\n const outputsDir = path.join(outDir, 'outputs');\n mkdirSync(outputsDir, { recursive: true });\n const manifestPath = path.join(outputsDir, 'curation-queue-manifest.json');\n const tasksPath = path.join(outputsDir, 'curation-queue-tasks.jsonl');\n const locksPath = path.join(outputsDir, 'curation-queue-locks.json');\n const blockersPath = path.join(outputsDir, 'curation-queue-blockers.jsonl');\n const inputHashes = buildInputHashes([\n processesPath,\n ...(flowsPath ? [flowsPath] : []),\n ...supportPaths,\n ...externalFlowRefPaths,\n ]);\n const locks = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n locks: tasks.map((task) => ({\n lock_key: task.lock_key,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n status: 'available',\n })),\n };\n const report: DatasetCurationQueueBuildReport = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status: blockers.length > 0 ? 'blocked' : 'ready',\n out_dir: path.resolve(outDir),\n inputs: {\n processes: path.resolve(processesPath),\n flows: flowsPath ? path.resolve(flowsPath) : null,\n support: supportPaths.map((inputPath) => path.resolve(inputPath)),\n external_flow_refs: externalFlowRefPaths.map((inputPath) => path.resolve(inputPath)),\n },\n counts: {\n support_rows: supportRows.length,\n flow_rows: flowRows.length,\n process_rows: processRows.length,\n external_flow_refs: externalFlowRefs.length,\n tasks: tasks.length,\n blockers: blockers.length,\n },\n hashes: {\n inputs: inputHashes,\n task_order: sha256(tasks.map((task) => task.task_id).join('\\n')),\n },\n files: {\n manifest: manifestPath,\n tasks: tasksPath,\n locks: locksPath,\n blockers: blockersPath,\n },\n tasks,\n blockers,\n };\n\n writeJson(manifestPath, report);\n writeText(tasksPath, jsonLines(tasks));\n writeJson(locksPath, locks);\n writeText(blockersPath, jsonLines(blockers));\n return report;\n}\n\nfunction readQueueRows(inputPath: string, entityType: DatasetCurationQueueEntityType): QueueRow[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => queueRowFromDatasetRow(inputPath, entityType, row));\n}\n\nfunction queueRowFromDatasetRow(\n inputPath: string,\n entityType: DatasetCurationQueueEntityType,\n row: DatasetRowInput,\n): QueueRow {\n const tidasIdentity = genericTidasDatasetIdentity(row.payload);\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid, tidasIdentity.id);\n if (!id) {\n throw new CliError(\n `${entityType} row is missing a stable id in ${inputPath} at index ${row.index}.`,\n {\n code: 'CURATION_QUEUE_ROW_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n return {\n entityType,\n sourcePath: inputPath,\n sourceIndex: row.index,\n row: row.row,\n payload: row.payload,\n id,\n version: firstNonEmpty(row.version, row.row.version, tidasIdentity.version) ?? DEFAULT_VERSION,\n };\n}\n\nfunction genericTidasDatasetIdentity(payload: JsonObject): {\n id: string | null;\n version: string | null;\n} {\n const root = genericTidasDatasetRoot(payload);\n const information = Object.values(root).find(\n (value) => isRecord(value) && isRecord(value.dataSetInformation),\n );\n const dataSetInformation =\n isRecord(information) && isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction genericTidasDatasetRoot(payload: JsonObject): JsonObject {\n const datasetRoots: JsonObject[] = [];\n for (const [key, value] of Object.entries(payload)) {\n if (key.endsWith('DataSet') && isRecord(value)) {\n datasetRoots.push(value);\n }\n }\n return datasetRoots.length === 1 ? datasetRoots[0] : payload;\n}\n\nfunction buildTask(outDir: string, row: QueueRow, dependsOn: string[]): DatasetCurationQueueTask {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n const workDir = path.join(\n outDir,\n 'entities',\n entityDirPlural(row.entityType),\n entityDirName(row.id, row.version),\n );\n return {\n schema_version: 1,\n entity_type: row.entityType,\n task_id: taskId,\n entity_id: row.id,\n version: row.version,\n lock_key: taskId,\n depends_on: dependsOn,\n input_rows_file: path.join(workDir, 'input.jsonl'),\n work_dir: workDir,\n checkpoint_file: path.join(workDir, 'checkpoint.json'),\n run_plan_file: path.join(workDir, 'entity-run-plan.json'),\n closure_file: path.join(workDir, 'closure.json'),\n };\n}\n\nfunction writeEntityArtifacts(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): void {\n mkdirSync(path.join(options.task.work_dir, 'checkpoints'), { recursive: true });\n writeText(options.task.input_rows_file, jsonLines([options.row.row]));\n writeJson(options.task.closure_file, {\n schema_version: 1,\n entity_type: options.row.entityType,\n entity_id: options.row.id,\n version: options.row.version,\n source: {\n file: path.resolve(options.row.sourcePath),\n index: options.row.sourceIndex,\n },\n dependencies: buildDependencyClosure(options),\n });\n writeJson(options.task.run_plan_file, buildRunPlan(options.task));\n}\n\nfunction buildDependencyClosure(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): unknown {\n if (options.row.entityType !== 'process') {\n return {\n local_tasks: [],\n external_refs: [],\n unresolved_refs: [],\n };\n }\n return {\n local_tasks: options.flowRefs\n .map((ref) => ({ ref, row: options.flowRowsById.get(ref.id) }))\n .filter((item): item is { ref: FlowRef; row: QueueRow } => Boolean(item.row))\n .map(({ ref, row }) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: row.version,\n task_id: taskIdFor('flow', ref.id, row.version),\n ref_path: ref.path,\n })),\n external_refs: options.flowRefs\n .filter((ref) => !options.flowRowsById.has(ref.id) && options.externalFlowIds.has(ref.id))\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n unresolved_refs: options.flowRefs\n .filter((ref) => !options.flowRowsById.has(ref.id) && !options.externalFlowIds.has(ref.id))\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n };\n}\n\nfunction buildRunPlan(task: DatasetCurationQueueTask): unknown {\n const stagesByType: Record<DatasetCurationQueueEntityType, string[]> = {\n support: ['identity', 'schema', 'qa_or_profile', 'checkpoint'],\n flow: ['identity', 'name_plan', 'schema', 'qa', 'checkpoint'],\n process: [\n 'dependency_closure',\n 'reference_refresh',\n 'required_fields',\n 'schema',\n 'qa',\n 'curation',\n 'remote_dry_run',\n 'readback',\n ],\n };\n return {\n schema_version: 1,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n input_rows_file: task.input_rows_file,\n checkpoint_file: task.checkpoint_file,\n stages: stagesByType[task.entity_type].map((stage) => ({\n id: stage,\n status: 'pending',\n checkpoint_file: path.join(task.work_dir, 'checkpoints', `${stage}.json`),\n })),\n ai_authoring_policy: {\n output_only: 'structured_patch_or_build_plan',\n deterministic_apply_required: true,\n remote_write_allowed: false,\n },\n };\n}\n\nfunction extractProcessFlowRefs(payload: unknown): FlowRef[] {\n const refs = new Map<string, FlowRef>();\n scanForFlowRefs(payload, [], refs);\n return [...refs.values()].sort((a, b) =>\n `${a.id}@${a.version ?? ''}`.localeCompare(`${b.id}@${b.version ?? ''}`),\n );\n}\n\nfunction scanForFlowRefs(value: unknown, pathParts: string[], refs: Map<string, FlowRef>): void {\n if (Array.isArray(value)) {\n value.forEach((item, index) => scanForFlowRefs(item, [...pathParts, String(index)], refs));\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n\n const keyPath = pathParts.join('.');\n const keyHint = keyPath.toLowerCase();\n const looksLikeFlowRef =\n keyHint.includes('referencetoflowdataset') ||\n keyHint.includes('reference_to_flow_dataset') ||\n keyHint.includes('flowdataset') ||\n keyHint.includes('flow_dataset');\n if (looksLikeFlowRef) {\n const id = firstNonEmpty(\n value['@refObjectId'],\n value.refObjectId,\n value.ref_object_id,\n value.id,\n value.uuid,\n value['common:UUID'],\n );\n if (id) {\n const version = firstNonEmpty(\n value['@version'],\n value.version,\n value.dataSetVersion,\n value['common:dataSetVersion'],\n );\n refs.set(`${id}@${version ?? ''}@${keyPath}`, {\n id,\n version,\n path: keyPath,\n });\n }\n }\n\n for (const [key, nested] of Object.entries(value)) {\n scanForFlowRefs(nested, [...pathParts, key], refs);\n }\n}\n\nfunction readExternalFlowRefs(inputPath: string): FlowRef[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => {\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid);\n if (!id) {\n throw new CliError(`External flow ref is missing id in ${inputPath} at index ${row.index}.`, {\n code: 'CURATION_QUEUE_EXTERNAL_FLOW_REF_ID_MISSING',\n exitCode: 2,\n });\n }\n return {\n id,\n version: firstNonEmpty(row.version, row.row.version) ?? null,\n path: `${inputPath}#${row.index}`,\n };\n });\n}\n\nfunction normalizeProcessLimit(value: number | undefined): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 1) {\n throw new CliError('--process-limit must be a positive integer.', {\n code: 'CURATION_QUEUE_PROCESS_LIMIT_INVALID',\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction requirePath(value: string | undefined, flag: string): string {\n const trimmed = value?.trim();\n if (!trimmed) {\n throw new CliError(`${flag} is required.`, {\n code: 'CURATION_QUEUE_REQUIRED_FLAG_MISSING',\n exitCode: 2,\n });\n }\n return trimmed;\n}\n\nfunction requireExistingPath(value: string | undefined, flag: string): string {\n const inputPath = requirePath(value, flag);\n if (!existsSync(inputPath)) {\n throw new CliError(`${flag} file does not exist: ${inputPath}`, {\n code: 'CURATION_QUEUE_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return inputPath;\n}\n\nfunction entityDirPlural(entityType: DatasetCurationQueueEntityType): string {\n return entityType === 'process' ? 'processes' : entityType === 'flow' ? 'flows' : 'supports';\n}\n\nfunction entityDirName(id: string, version: string): string {\n return `${sanitizePathToken(id)}__${sanitizePathToken(version)}`;\n}\n\nfunction taskIdFor(\n entityType: DatasetCurationQueueEntityType,\n id: string,\n version: string,\n): string {\n return `${entityType}:${id}@${version}`;\n}\n\nfunction sanitizePathToken(value: string): string {\n return value.replace(/[^A-Za-z0-9._-]+/gu, '_').replace(/^_+|_+$/gu, '') || 'unknown';\n}\n\nfunction buildInputHashes(inputPaths: string[]): Record<string, string> {\n const hashes: Record<string, string> = {};\n for (const inputPath of inputPaths) {\n hashes[path.resolve(inputPath)] = sha256(readFileSync(inputPath));\n }\n return hashes;\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction writeJson(filePath: string, value: unknown): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n}\n\nfunction writeText(filePath: string, value: string): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, value, 'utf8');\n}\n\nfunction jsonLines(rows: unknown[]): string {\n return rows.map((row) => JSON.stringify(row)).join('\\n') + (rows.length > 0 ? '\\n' : '');\n}\n\nexport const __testInternals = {\n extractProcessFlowRefs,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"dataset-curation-queue.js","sourceRoot":"","sources":["../../../src/lib/dataset-curation-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport {\n firstNonEmpty,\n isRecord,\n materializeDatasetRows,\n type DatasetRowInput,\n type JsonObject,\n} from './dataset-local.js';\n\nexport type DatasetCurationQueueEntityType = 'support' | 'flow' | 'process';\n\nexport type RunDatasetCurationQueueBuildOptions = {\n processesPath: string;\n flowsPath?: string;\n supportPaths?: string[];\n externalFlowRefPaths?: string[];\n outDir: string;\n excludeProcessIds?: string[];\n processLimit?: number;\n};\n\nexport type RunDatasetCurationQueueNextOptions = {\n queueDir: string;\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n};\n\nexport type RunDatasetCurationQueueVerifyOptions = {\n queueDir: string;\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n};\n\nexport type DatasetCurationQueueTask = {\n schema_version: 1;\n entity_type: DatasetCurationQueueEntityType;\n task_id: string;\n entity_id: string;\n version: string;\n lock_key: string;\n depends_on: string[];\n input_rows_file: string;\n work_dir: string;\n checkpoint_file: string;\n run_plan_file: string;\n closure_file: string;\n};\n\ntype DatasetCurationQueueBlocker = {\n schema_version: 1;\n code: string;\n severity: 'blocker';\n entity_type: DatasetCurationQueueEntityType;\n entity_id: string | null;\n version: string | null;\n message: string;\n details?: unknown;\n};\n\nexport type DatasetCurationQueueBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'ready' | 'blocked';\n out_dir: string;\n inputs: {\n processes: string;\n flows: string | null;\n support: string[];\n external_flow_refs: string[];\n };\n counts: {\n support_rows: number;\n flow_rows: number;\n process_rows: number;\n external_flow_refs: number;\n tasks: number;\n blockers: number;\n };\n hashes: {\n inputs: Record<string, string>;\n task_order: string;\n };\n files: {\n manifest: string;\n tasks: string;\n locks: string;\n blockers: string;\n };\n tasks: DatasetCurationQueueTask[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\nexport type DatasetCurationQueueTaskRuntimeStatus =\n | 'complete'\n | 'pending'\n | 'waiting_dependencies'\n | 'blocked';\n\nexport type DatasetCurationQueueTaskState = {\n task_id: string;\n entity_type: DatasetCurationQueueEntityType;\n entity_id: string;\n version: string;\n status: DatasetCurationQueueTaskRuntimeStatus;\n checkpoint_status: string | null;\n checkpoint_file: string;\n depends_on: string[];\n incomplete_dependencies: string[];\n reason: string | null;\n};\n\nexport type DatasetCurationQueueNextReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'ready' | 'complete' | 'blocked';\n queue_dir: string;\n scope: {\n entity_type: DatasetCurationQueueEntityType | null;\n task_id: string | null;\n };\n counts: {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n runnable: number;\n };\n next_task:\n | (DatasetCurationQueueTask & {\n action: {\n kind: 'entity_curation_task';\n input_artifact: string;\n output_artifacts: string[];\n };\n })\n | null;\n task_states: DatasetCurationQueueTaskState[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\nexport type DatasetCurationQueueVerifyReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'passed' | 'blocked';\n queue_dir: string;\n scope: {\n entity_type: DatasetCurationQueueEntityType | null;\n task_id: string | null;\n };\n counts: {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n };\n task_states: DatasetCurationQueueTaskState[];\n blockers: DatasetCurationQueueBlocker[];\n};\n\ntype QueueRow = {\n entityType: DatasetCurationQueueEntityType;\n sourcePath: string;\n sourceIndex: number;\n row: JsonObject;\n payload: JsonObject;\n id: string;\n version: string;\n};\n\ntype FlowRef = {\n id: string;\n version: string | null;\n path: string;\n};\n\ntype DeferredFlowRef = FlowRef & {\n actionItemCode: string | null;\n reason: string | null;\n};\n\nconst DEFAULT_VERSION = 'unversioned';\n\nexport async function runDatasetCurationQueueBuild(\n options: RunDatasetCurationQueueBuildOptions,\n): Promise<DatasetCurationQueueBuildReport> {\n const outDir = requirePath(options.outDir, '--out-dir');\n const processesPath = requireExistingPath(options.processesPath, '--processes');\n const flowsPath = options.flowsPath ? requireExistingPath(options.flowsPath, '--flows') : null;\n const supportPaths = (options.supportPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--support'),\n );\n const externalFlowRefPaths = (options.externalFlowRefPaths ?? []).map((inputPath) =>\n requireExistingPath(inputPath, '--external-flow-ref'),\n );\n const processLimit = normalizeProcessLimit(options.processLimit);\n const excludedProcessIds = new Set((options.excludeProcessIds ?? []).map((id) => id.trim()));\n\n const supportRows = supportPaths.flatMap((inputPath) => readQueueRows(inputPath, 'support'));\n const flowRows = flowsPath ? readQueueRows(flowsPath, 'flow') : [];\n const processRows = readQueueRows(processesPath, 'process')\n .filter((row) => !excludedProcessIds.has(row.id))\n .slice(0, processLimit ?? undefined);\n const externalFlowRefs = externalFlowRefPaths.flatMap((inputPath) =>\n readExternalFlowRefs(inputPath),\n );\n\n mkdirSync(outDir, { recursive: true });\n\n const localFlowTasks = new Map<string, string>();\n const flowRowsById = new Map<string, QueueRow>();\n for (const row of flowRows) {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n localFlowTasks.set(row.id, taskId);\n flowRowsById.set(row.id, row);\n }\n\n const externalFlowIds = new Set(externalFlowRefs.map((ref) => ref.id));\n const blockers: DatasetCurationQueueBlocker[] = [];\n const supportTasks = supportRows.map((row) => buildTask(outDir, row, []));\n const flowTasks = flowRows.map((row) => buildTask(outDir, row, []));\n const processTasks = processRows.map((row) => {\n const refs = extractProcessFlowRefs(row.payload);\n const deferredRefs = extractDeferredProcessFlowRefs(row.payload);\n const deferredRefKeys = deferredProcessFlowRefKeys(deferredRefs);\n const dependsOn = new Set<string>();\n const missingRefs: FlowRef[] = [];\n for (const ref of refs) {\n const taskId = localFlowTasks.get(ref.id);\n if (taskId) {\n dependsOn.add(taskId);\n } else if (!externalFlowIds.has(ref.id) && !deferredRefKeys.has(flowRefKey(ref))) {\n missingRefs.push(ref);\n }\n }\n if (missingRefs.length > 0) {\n blockers.push({\n schema_version: 1,\n code: 'process_flow_reference_unresolved',\n severity: 'blocker',\n entity_type: 'process',\n entity_id: row.id,\n version: row.version,\n message:\n 'Process references flows that are neither present in local flow rows nor declared as external flow refs.',\n details: { missing_flow_refs: missingRefs },\n });\n }\n return buildTask(outDir, row, [...dependsOn].sort());\n });\n const tasks = [...supportTasks, ...flowTasks, ...processTasks];\n const taskRows = [\n ...supportRows.map((row, index) => ({ row, task: supportTasks[index] })),\n ...flowRows.map((row, index) => ({ row, task: flowTasks[index] })),\n ...processRows.map((row, index) => ({ row, task: processTasks[index] })),\n ];\n\n for (const { row, task } of taskRows) {\n writeEntityArtifacts({\n row,\n task,\n flowRefs: row.entityType === 'process' ? extractProcessFlowRefs(row.payload) : [],\n deferredFlowRefs:\n row.entityType === 'process' ? extractDeferredProcessFlowRefs(row.payload) : [],\n externalFlowIds,\n flowRowsById,\n });\n }\n\n const outputsDir = path.join(outDir, 'outputs');\n mkdirSync(outputsDir, { recursive: true });\n const manifestPath = path.join(outputsDir, 'curation-queue-manifest.json');\n const tasksPath = path.join(outputsDir, 'curation-queue-tasks.jsonl');\n const locksPath = path.join(outputsDir, 'curation-queue-locks.json');\n const blockersPath = path.join(outputsDir, 'curation-queue-blockers.jsonl');\n const inputHashes = buildInputHashes([\n processesPath,\n ...(flowsPath ? [flowsPath] : []),\n ...supportPaths,\n ...externalFlowRefPaths,\n ]);\n const locks = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n locks: tasks.map((task) => ({\n lock_key: task.lock_key,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n status: 'available',\n })),\n };\n const report: DatasetCurationQueueBuildReport = {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status: blockers.length > 0 ? 'blocked' : 'ready',\n out_dir: path.resolve(outDir),\n inputs: {\n processes: path.resolve(processesPath),\n flows: flowsPath ? path.resolve(flowsPath) : null,\n support: supportPaths.map((inputPath) => path.resolve(inputPath)),\n external_flow_refs: externalFlowRefPaths.map((inputPath) => path.resolve(inputPath)),\n },\n counts: {\n support_rows: supportRows.length,\n flow_rows: flowRows.length,\n process_rows: processRows.length,\n external_flow_refs: externalFlowRefs.length,\n tasks: tasks.length,\n blockers: blockers.length,\n },\n hashes: {\n inputs: inputHashes,\n task_order: sha256(tasks.map((task) => task.task_id).join('\\n')),\n },\n files: {\n manifest: manifestPath,\n tasks: tasksPath,\n locks: locksPath,\n blockers: blockersPath,\n },\n tasks,\n blockers,\n };\n\n writeJson(manifestPath, report);\n writeText(tasksPath, jsonLines(tasks));\n writeJson(locksPath, locks);\n writeText(blockersPath, jsonLines(blockers));\n return report;\n}\n\nexport async function runDatasetCurationQueueNext(\n options: RunDatasetCurationQueueNextOptions,\n): Promise<DatasetCurationQueueNextReport> {\n const queue = readQueueRuntime(options.queueDir);\n const scope = normalizeQueueScope(options);\n const taskStates = buildTaskStates(queue.tasks).filter((state) => taskMatchesScope(state, scope));\n const scopedTasks = queue.tasks.filter((task) => taskMatchesScope(task, scope));\n const stateByTaskId = new Map(taskStates.map((state) => [state.task_id, state]));\n const runnable = scopedTasks.filter(\n (task) => stateByTaskId.get(task.task_id)?.status === 'pending',\n );\n const counts = countTaskStates(taskStates);\n const status =\n queue.blockers.length > 0 ||\n (taskStates.length > 0 && runnable.length === 0 && counts.complete < taskStates.length)\n ? 'blocked'\n : counts.complete === taskStates.length\n ? 'complete'\n : 'ready';\n const nextTask = status === 'ready' && runnable[0] ? withQueueAction(runnable[0]) : null;\n return {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status,\n queue_dir: queue.queueDir,\n scope,\n counts: {\n ...counts,\n runnable: runnable.length,\n },\n next_task: nextTask,\n task_states: taskStates,\n blockers: queue.blockers,\n };\n}\n\nexport async function runDatasetCurationQueueVerify(\n options: RunDatasetCurationQueueVerifyOptions,\n): Promise<DatasetCurationQueueVerifyReport> {\n const queue = readQueueRuntime(options.queueDir);\n const scope = normalizeQueueScope(options);\n const taskStates = buildTaskStates(queue.tasks).filter((state) => taskMatchesScope(state, scope));\n const counts = countTaskStates(taskStates);\n return {\n schema_version: 1,\n generated_at_utc: new Date().toISOString(),\n status:\n queue.blockers.length === 0 && counts.complete === taskStates.length ? 'passed' : 'blocked',\n queue_dir: queue.queueDir,\n scope,\n counts,\n task_states: taskStates,\n blockers: queue.blockers,\n };\n}\n\nfunction readQueueRuntime(queueDirInput: string): {\n queueDir: string;\n tasks: DatasetCurationQueueTask[];\n blockers: DatasetCurationQueueBlocker[];\n} {\n const queueDir = requireExistingPath(queueDirInput, '--queue-dir');\n const outputsDir = path.join(queueDir, 'outputs');\n const tasksPath = path.join(outputsDir, 'curation-queue-tasks.jsonl');\n const blockersPath = path.join(outputsDir, 'curation-queue-blockers.jsonl');\n if (!existsSync(tasksPath)) {\n throw new CliError(`curation queue tasks file does not exist: ${tasksPath}`, {\n code: 'CURATION_QUEUE_TASKS_NOT_FOUND',\n exitCode: 2,\n });\n }\n if (!existsSync(blockersPath)) {\n throw new CliError(`curation queue blockers file does not exist: ${blockersPath}`, {\n code: 'CURATION_QUEUE_BLOCKERS_NOT_FOUND',\n exitCode: 2,\n });\n }\n return {\n queueDir: path.resolve(queueDir),\n tasks: readJsonlFile(tasksPath).map((value, index) => parseQueueTask(value, tasksPath, index)),\n blockers: readJsonlFile(blockersPath).map((value, index) =>\n parseQueueBlocker(value, blockersPath, index),\n ),\n };\n}\n\nfunction normalizeQueueScope(options: {\n entityType?: DatasetCurationQueueEntityType;\n taskId?: string;\n}): { entity_type: DatasetCurationQueueEntityType | null; task_id: string | null } {\n return {\n entity_type: options.entityType ?? null,\n task_id: options.taskId?.trim() || null,\n };\n}\n\nfunction buildTaskStates(tasks: DatasetCurationQueueTask[]): DatasetCurationQueueTaskState[] {\n const completeTaskIds = new Set(\n tasks\n .filter((task) => isCompleteCheckpointStatus(readCheckpointStatus(task.checkpoint_file)))\n .map((task) => task.task_id),\n );\n return tasks.map((task) => {\n const checkpointStatus = readCheckpointStatus(task.checkpoint_file);\n const incompleteDependencies = task.depends_on.filter((taskId) => !completeTaskIds.has(taskId));\n const status = taskRuntimeStatus(checkpointStatus, incompleteDependencies);\n return {\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n status,\n checkpoint_status: checkpointStatus,\n checkpoint_file: task.checkpoint_file,\n depends_on: task.depends_on,\n incomplete_dependencies: incompleteDependencies,\n reason:\n status === 'waiting_dependencies'\n ? 'dependency checkpoints are not complete'\n : status === 'blocked'\n ? 'checkpoint status is blocked or failed'\n : null,\n };\n });\n}\n\nfunction taskRuntimeStatus(\n checkpointStatus: string | null,\n incompleteDependencies: string[],\n): DatasetCurationQueueTaskRuntimeStatus {\n if (isCompleteCheckpointStatus(checkpointStatus)) {\n return 'complete';\n }\n if (checkpointStatus === 'blocked' || checkpointStatus === 'failed') {\n return 'blocked';\n }\n if (incompleteDependencies.length > 0) {\n return 'waiting_dependencies';\n }\n return 'pending';\n}\n\nfunction isCompleteCheckpointStatus(status: string | null): boolean {\n return (\n status === 'passed' || status === 'complete' || status === 'completed' || status === 'waived'\n );\n}\n\nfunction readCheckpointStatus(checkpointFile: string): string | null {\n const resolvedPath = path.resolve(checkpointFile);\n if (!existsSync(resolvedPath)) {\n return null;\n }\n try {\n const value = JSON.parse(readFileSync(resolvedPath, 'utf8')) as unknown;\n if (!isRecord(value)) {\n return 'blocked';\n }\n const status = firstNonEmpty(value.status, value.state);\n return status ? status.toLowerCase() : 'blocked';\n } catch {\n return 'blocked';\n }\n}\n\nfunction taskMatchesScope(\n task: Pick<DatasetCurationQueueTask, 'entity_type' | 'task_id'>,\n scope: { entity_type: DatasetCurationQueueEntityType | null; task_id: string | null },\n): boolean {\n if (scope.entity_type && task.entity_type !== scope.entity_type) {\n return false;\n }\n if (scope.task_id && task.task_id !== scope.task_id) {\n return false;\n }\n return true;\n}\n\nfunction countTaskStates(taskStates: DatasetCurationQueueTaskState[]): {\n total: number;\n complete: number;\n pending: number;\n waiting_dependencies: number;\n blocked: number;\n} {\n return {\n total: taskStates.length,\n complete: taskStates.filter((state) => state.status === 'complete').length,\n pending: taskStates.filter((state) => state.status === 'pending').length,\n waiting_dependencies: taskStates.filter((state) => state.status === 'waiting_dependencies')\n .length,\n blocked: taskStates.filter((state) => state.status === 'blocked').length,\n };\n}\n\nfunction withQueueAction(task: DatasetCurationQueueTask): DatasetCurationQueueTask & {\n action: {\n kind: 'entity_curation_task';\n input_artifact: string;\n output_artifacts: string[];\n };\n} {\n return {\n ...task,\n action: {\n kind: 'entity_curation_task',\n input_artifact: task.input_rows_file,\n output_artifacts: [task.checkpoint_file],\n },\n };\n}\n\nfunction readJsonlFile(inputPath: string): unknown[] {\n const text = readFileSync(inputPath, 'utf8').trim();\n if (!text) {\n return [];\n }\n return text.split(/\\r?\\n/u).map((line, index) => {\n try {\n return JSON.parse(line) as unknown;\n } catch (error) {\n throw new CliError(`Invalid JSONL in ${inputPath} at line ${index + 1}: ${String(error)}`, {\n code: 'CURATION_QUEUE_JSONL_INVALID',\n exitCode: 2,\n });\n }\n });\n}\n\nfunction parseQueueTask(\n value: unknown,\n inputPath: string,\n index: number,\n): DatasetCurationQueueTask {\n if (!isRecord(value)) {\n throw new CliError(`Invalid queue task in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n }\n const entityType = value.entity_type;\n if (entityType !== 'support' && entityType !== 'flow' && entityType !== 'process') {\n throw new CliError(`Invalid queue task entity_type in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n }\n return {\n schema_version: 1,\n entity_type: entityType,\n task_id: requireString(value.task_id, inputPath, index, 'task_id'),\n entity_id: requireString(value.entity_id, inputPath, index, 'entity_id'),\n version: requireString(value.version, inputPath, index, 'version'),\n lock_key: requireString(value.lock_key, inputPath, index, 'lock_key'),\n depends_on: Array.isArray(value.depends_on)\n ? value.depends_on.filter((item): item is string => typeof item === 'string')\n : [],\n input_rows_file: requireString(value.input_rows_file, inputPath, index, 'input_rows_file'),\n work_dir: requireString(value.work_dir, inputPath, index, 'work_dir'),\n checkpoint_file: requireString(value.checkpoint_file, inputPath, index, 'checkpoint_file'),\n run_plan_file: requireString(value.run_plan_file, inputPath, index, 'run_plan_file'),\n closure_file: requireString(value.closure_file, inputPath, index, 'closure_file'),\n };\n}\n\nfunction parseQueueBlocker(\n value: unknown,\n inputPath: string,\n index: number,\n): DatasetCurationQueueBlocker {\n if (!isRecord(value)) {\n throw new CliError(`Invalid queue blocker in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_BLOCKER_INVALID',\n exitCode: 2,\n });\n }\n const entityType = value.entity_type;\n if (entityType !== 'support' && entityType !== 'flow' && entityType !== 'process') {\n throw new CliError(`Invalid queue blocker entity_type in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_BLOCKER_INVALID',\n exitCode: 2,\n });\n }\n return {\n schema_version: 1,\n code: requireString(value.code, inputPath, index, 'code'),\n severity: 'blocker',\n entity_type: entityType,\n entity_id: typeof value.entity_id === 'string' ? value.entity_id : null,\n version: typeof value.version === 'string' ? value.version : null,\n message: requireString(value.message, inputPath, index, 'message'),\n details: value.details,\n };\n}\n\nfunction requireString(value: unknown, inputPath: string, index: number, field: string): string {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n throw new CliError(`Invalid or missing ${field} in ${inputPath} at line ${index + 1}.`, {\n code: 'CURATION_QUEUE_TASK_INVALID',\n exitCode: 2,\n });\n}\n\nfunction readQueueRows(inputPath: string, entityType: DatasetCurationQueueEntityType): QueueRow[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => queueRowFromDatasetRow(inputPath, entityType, row));\n}\n\nfunction queueRowFromDatasetRow(\n inputPath: string,\n entityType: DatasetCurationQueueEntityType,\n row: DatasetRowInput,\n): QueueRow {\n const tidasIdentity = genericTidasDatasetIdentity(row.payload);\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid, tidasIdentity.id);\n if (!id) {\n throw new CliError(\n `${entityType} row is missing a stable id in ${inputPath} at index ${row.index}.`,\n {\n code: 'CURATION_QUEUE_ROW_ID_MISSING',\n exitCode: 2,\n },\n );\n }\n return {\n entityType,\n sourcePath: inputPath,\n sourceIndex: row.index,\n row: row.row,\n payload: row.payload,\n id,\n version: firstNonEmpty(row.version, row.row.version, tidasIdentity.version) ?? DEFAULT_VERSION,\n };\n}\n\nfunction genericTidasDatasetIdentity(payload: JsonObject): {\n id: string | null;\n version: string | null;\n} {\n const root = genericTidasDatasetRoot(payload);\n const information = Object.values(root).find(\n (value) => isRecord(value) && isRecord(value.dataSetInformation),\n );\n const dataSetInformation =\n isRecord(information) && isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction genericTidasDatasetRoot(payload: JsonObject): JsonObject {\n const datasetRoots: JsonObject[] = [];\n for (const [key, value] of Object.entries(payload)) {\n if (key.endsWith('DataSet') && isRecord(value)) {\n datasetRoots.push(value);\n }\n }\n return datasetRoots.length === 1 ? datasetRoots[0] : payload;\n}\n\nfunction buildTask(outDir: string, row: QueueRow, dependsOn: string[]): DatasetCurationQueueTask {\n const taskId = taskIdFor(row.entityType, row.id, row.version);\n const workDir = path.join(\n outDir,\n 'entities',\n entityDirPlural(row.entityType),\n entityDirName(row.id, row.version),\n );\n return {\n schema_version: 1,\n entity_type: row.entityType,\n task_id: taskId,\n entity_id: row.id,\n version: row.version,\n lock_key: taskId,\n depends_on: dependsOn,\n input_rows_file: path.join(workDir, 'input.jsonl'),\n work_dir: workDir,\n checkpoint_file: path.join(workDir, 'checkpoint.json'),\n run_plan_file: path.join(workDir, 'entity-run-plan.json'),\n closure_file: path.join(workDir, 'closure.json'),\n };\n}\n\nfunction writeEntityArtifacts(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n deferredFlowRefs: DeferredFlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): void {\n mkdirSync(path.join(options.task.work_dir, 'checkpoints'), { recursive: true });\n writeText(options.task.input_rows_file, jsonLines([options.row.row]));\n writeJson(options.task.closure_file, {\n schema_version: 1,\n entity_type: options.row.entityType,\n entity_id: options.row.id,\n version: options.row.version,\n source: {\n file: path.resolve(options.row.sourcePath),\n index: options.row.sourceIndex,\n },\n dependencies: buildDependencyClosure(options),\n });\n writeJson(options.task.run_plan_file, buildRunPlan(options.task));\n}\n\nfunction buildDependencyClosure(options: {\n row: QueueRow;\n task: DatasetCurationQueueTask;\n flowRefs: FlowRef[];\n deferredFlowRefs: DeferredFlowRef[];\n externalFlowIds: Set<string>;\n flowRowsById: Map<string, QueueRow>;\n}): unknown {\n if (options.row.entityType !== 'process') {\n return {\n local_tasks: [],\n external_refs: [],\n deferred_refs: [],\n unresolved_refs: [],\n };\n }\n const deferredRefKeys = deferredProcessFlowRefKeys(options.deferredFlowRefs);\n return {\n local_tasks: options.flowRefs\n .map((ref) => ({ ref, row: options.flowRowsById.get(ref.id) }))\n .filter((item): item is { ref: FlowRef; row: QueueRow } => Boolean(item.row))\n .map(({ ref, row }) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: row.version,\n task_id: taskIdFor('flow', ref.id, row.version),\n ref_path: ref.path,\n })),\n external_refs: options.flowRefs\n .filter((ref) => !options.flowRowsById.has(ref.id) && options.externalFlowIds.has(ref.id))\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n deferred_refs: options.flowRefs\n .filter(\n (ref) =>\n !options.flowRowsById.has(ref.id) &&\n !options.externalFlowIds.has(ref.id) &&\n deferredRefKeys.has(flowRefKey(ref)),\n )\n .map((ref) => {\n const deferredRef = deferredRefKeys.get(flowRefKey(ref))!;\n return {\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n action_item_code: deferredRef.actionItemCode,\n reason: deferredRef.reason ?? null,\n };\n }),\n unresolved_refs: options.flowRefs\n .filter(\n (ref) =>\n !options.flowRowsById.has(ref.id) &&\n !options.externalFlowIds.has(ref.id) &&\n !deferredRefKeys.has(flowRefKey(ref)),\n )\n .map((ref) => ({\n entity_type: 'flow',\n entity_id: ref.id,\n version: ref.version,\n ref_path: ref.path,\n })),\n };\n}\n\nfunction buildRunPlan(task: DatasetCurationQueueTask): unknown {\n const stagesByType: Record<DatasetCurationQueueEntityType, string[]> = {\n support: ['identity', 'schema', 'qa_or_profile', 'checkpoint'],\n flow: ['identity', 'name_plan', 'schema', 'qa', 'checkpoint'],\n process: [\n 'dependency_closure',\n 'reference_refresh',\n 'required_fields',\n 'schema',\n 'qa',\n 'curation',\n 'remote_dry_run',\n 'readback',\n ],\n };\n return {\n schema_version: 1,\n task_id: task.task_id,\n entity_type: task.entity_type,\n entity_id: task.entity_id,\n version: task.version,\n input_rows_file: task.input_rows_file,\n checkpoint_file: task.checkpoint_file,\n stages: stagesByType[task.entity_type].map((stage) => ({\n id: stage,\n status: 'pending',\n checkpoint_file: path.join(task.work_dir, 'checkpoints', `${stage}.json`),\n })),\n ai_authoring_policy: {\n output_only: 'structured_patch_or_build_plan',\n deterministic_apply_required: true,\n remote_write_allowed: false,\n },\n };\n}\n\nfunction extractDeferredProcessFlowRefs(payload: unknown): DeferredFlowRef[] {\n const refs = new Map<string, DeferredFlowRef>();\n scanForDeferredProcessFlowRefs(payload, refs);\n return [...refs.values()].sort((a, b) =>\n `${a.id}@${a.version ?? ''}@${a.path}`.localeCompare(`${b.id}@${b.version ?? ''}@${b.path}`),\n );\n}\n\nfunction scanForDeferredProcessFlowRefs(value: unknown, refs: Map<string, DeferredFlowRef>): void {\n if (Array.isArray(value)) {\n value.forEach((item) => scanForDeferredProcessFlowRefs(item, refs));\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n\n const traces = asList(value['tiangongfoundry:unresolvedTrace']);\n for (const trace of traces) {\n if (!isRecord(trace)) {\n continue;\n }\n const actionItemCode = firstNonEmpty(trace.action_item_code, trace.actionItemCode);\n if (actionItemCode !== 'elementary_flow_identity_manual_review') {\n continue;\n }\n const id = firstNonEmpty(trace.reference_id, trace.referenceId, trace.ref_object_id);\n const pathValue = firstNonEmpty(trace.blocked_path, trace.blockedPath, trace.path);\n if (!id || !pathValue) {\n continue;\n }\n const version = firstNonEmpty(trace.reference_version, trace.referenceVersion, trace.version);\n const ref = {\n id,\n version,\n path: normalizeReferencePath(pathValue),\n actionItemCode,\n reason: firstNonEmpty(trace.reason),\n };\n refs.set(flowRefKey(ref), ref);\n }\n\n for (const nested of Object.values(value)) {\n scanForDeferredProcessFlowRefs(nested, refs);\n }\n}\n\nfunction deferredProcessFlowRefKeys(refs: DeferredFlowRef[]): Map<string, DeferredFlowRef> {\n const keys = new Map<string, DeferredFlowRef>();\n for (const ref of refs) {\n keys.set(flowRefKey(ref), ref);\n }\n return keys;\n}\n\nfunction flowRefKey(ref: FlowRef): string {\n return `${ref.id}@${ref.version ?? ''}@${normalizeReferencePath(ref.path)}`;\n}\n\nfunction normalizeReferencePath(value: string): string {\n return value\n .replace(/^\\/+/u, '')\n .replace(/\\/+/gu, '.')\n .replace(/^\\.+|\\.+$/gu, '');\n}\n\nfunction isFoundryTracePathParts(pathParts: string[]): boolean {\n return (\n pathParts.includes('common:other') &&\n pathParts.some(\n (part) => part.startsWith('tiangongfoundry:') && part.toLowerCase().includes('trace'),\n )\n );\n}\n\nfunction extractProcessFlowRefs(payload: unknown): FlowRef[] {\n const refs = new Map<string, FlowRef>();\n scanForFlowRefs(payload, [], refs);\n return [...refs.values()].sort((a, b) =>\n `${a.id}@${a.version ?? ''}`.localeCompare(`${b.id}@${b.version ?? ''}`),\n );\n}\n\nfunction scanForFlowRefs(value: unknown, pathParts: string[], refs: Map<string, FlowRef>): void {\n if (isFoundryTracePathParts(pathParts)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => scanForFlowRefs(item, [...pathParts, String(index)], refs));\n return;\n }\n if (!isRecord(value)) {\n return;\n }\n\n const keyPath = pathParts.join('.');\n const keyHint = keyPath.toLowerCase();\n const looksLikeFlowRef =\n keyHint.includes('referencetoflowdataset') ||\n keyHint.includes('reference_to_flow_dataset') ||\n keyHint.includes('flowdataset') ||\n keyHint.includes('flow_dataset');\n if (looksLikeFlowRef) {\n const id = firstNonEmpty(\n value['@refObjectId'],\n value.refObjectId,\n value.ref_object_id,\n value.id,\n value.uuid,\n value['common:UUID'],\n );\n if (id) {\n const version = firstNonEmpty(\n value['@version'],\n value.version,\n value.dataSetVersion,\n value['common:dataSetVersion'],\n );\n refs.set(`${id}@${version ?? ''}@${keyPath}`, {\n id,\n version,\n path: keyPath,\n });\n }\n }\n\n for (const [key, nested] of Object.entries(value)) {\n scanForFlowRefs(nested, [...pathParts, key], refs);\n }\n}\n\nfunction readExternalFlowRefs(inputPath: string): FlowRef[] {\n const rows = materializeDatasetRows(inputPath);\n return rows.map((row) => {\n const id = firstNonEmpty(row.id, row.row.id, row.row.dataset_id, row.row.uuid);\n if (!id) {\n throw new CliError(`External flow ref is missing id in ${inputPath} at index ${row.index}.`, {\n code: 'CURATION_QUEUE_EXTERNAL_FLOW_REF_ID_MISSING',\n exitCode: 2,\n });\n }\n return {\n id,\n version: firstNonEmpty(row.version, row.row.version) ?? null,\n path: `${inputPath}#${row.index}`,\n };\n });\n}\n\nfunction asList(value: unknown): unknown[] {\n if (value === undefined || value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n\nfunction normalizeProcessLimit(value: number | undefined): number | null {\n if (value === undefined) {\n return null;\n }\n if (!Number.isInteger(value) || value < 1) {\n throw new CliError('--process-limit must be a positive integer.', {\n code: 'CURATION_QUEUE_PROCESS_LIMIT_INVALID',\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction requirePath(value: string | undefined, flag: string): string {\n const trimmed = value?.trim();\n if (!trimmed) {\n throw new CliError(`${flag} is required.`, {\n code: 'CURATION_QUEUE_REQUIRED_FLAG_MISSING',\n exitCode: 2,\n });\n }\n return trimmed;\n}\n\nfunction requireExistingPath(value: string | undefined, flag: string): string {\n const inputPath = requirePath(value, flag);\n if (!existsSync(inputPath)) {\n throw new CliError(`${flag} file does not exist: ${inputPath}`, {\n code: 'CURATION_QUEUE_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return inputPath;\n}\n\nfunction entityDirPlural(entityType: DatasetCurationQueueEntityType): string {\n return entityType === 'process' ? 'processes' : entityType === 'flow' ? 'flows' : 'supports';\n}\n\nfunction entityDirName(id: string, version: string): string {\n return `${sanitizePathToken(id)}__${sanitizePathToken(version)}`;\n}\n\nfunction taskIdFor(\n entityType: DatasetCurationQueueEntityType,\n id: string,\n version: string,\n): string {\n return `${entityType}:${id}@${version}`;\n}\n\nfunction sanitizePathToken(value: string): string {\n return value.replace(/[^A-Za-z0-9._-]+/gu, '_').replace(/^_+|_+$/gu, '') || 'unknown';\n}\n\nfunction buildInputHashes(inputPaths: string[]): Record<string, string> {\n const hashes: Record<string, string> = {};\n for (const inputPath of inputPaths) {\n hashes[path.resolve(inputPath)] = sha256(readFileSync(inputPath));\n }\n return hashes;\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction writeJson(filePath: string, value: unknown): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n}\n\nfunction writeText(filePath: string, value: string): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(filePath, value, 'utf8');\n}\n\nfunction jsonLines(rows: unknown[]): string {\n return rows.map((row) => JSON.stringify(row)).join('\\n') + (rows.length > 0 ? '\\n' : '');\n}\n\nexport const __testInternals = {\n buildTaskStates,\n countTaskStates,\n entityDirName,\n entityDirPlural,\n extractDeferredProcessFlowRefs,\n extractProcessFlowRefs,\n jsonLines,\n normalizeReferencePath,\n normalizeProcessLimit,\n normalizeQueueScope,\n parseQueueBlocker,\n parseQueueTask,\n readCheckpointStatus,\n readJsonlFile,\n readQueueRuntime,\n requireExistingPath,\n requirePath,\n sanitizePathToken,\n taskIdFor,\n taskMatchesScope,\n taskRuntimeStatus,\n withQueueAction,\n};\n"]}
|
|
@@ -11,6 +11,16 @@ export function runDatasetImportLcaConvert(options) {
|
|
|
11
11
|
const fromFormat = options.fromFormat?.trim() || 'auto';
|
|
12
12
|
const pythonBin = options.pythonBin?.trim() || 'python3';
|
|
13
13
|
const tidasToolsRoot = resolveTidasToolsRoot(options.tidasToolsDir, options.env ?? process.env);
|
|
14
|
+
const processBundlesDir = options.processBundlesDir
|
|
15
|
+
? path.resolve(options.processBundlesDir)
|
|
16
|
+
: path.join(outputDir, 'process-bundles');
|
|
17
|
+
const processBundles = !options.detectOnly && options.processBundles !== false;
|
|
18
|
+
if (options.processBundles === false && options.processBundlesDir?.trim()) {
|
|
19
|
+
throw new CliError('--process-bundles-dir cannot be used with --no-process-bundles.', {
|
|
20
|
+
code: 'DATASET_IMPORT_LCA_PROCESS_BUNDLES_INVALID',
|
|
21
|
+
exitCode: 2,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
14
24
|
const reportPath = path.resolve(options.reportPath ?? path.join(outputDir, 'conversion-report.json'));
|
|
15
25
|
const commandArgs = [
|
|
16
26
|
'-m',
|
|
@@ -36,6 +46,12 @@ export function runDatasetImportLcaConvert(options) {
|
|
|
36
46
|
if (options.failOnWarning) {
|
|
37
47
|
commandArgs.push('--fail-on-warning');
|
|
38
48
|
}
|
|
49
|
+
if (!options.detectOnly && (processBundles || options.processBundlesDir?.trim())) {
|
|
50
|
+
commandArgs.push('--process-bundles');
|
|
51
|
+
}
|
|
52
|
+
if (!options.detectOnly && options.processBundlesDir?.trim()) {
|
|
53
|
+
commandArgs.push('--process-bundles-dir', processBundlesDir);
|
|
54
|
+
}
|
|
39
55
|
if (options.detectOnly) {
|
|
40
56
|
commandArgs.push('--detect-only');
|
|
41
57
|
}
|
|
@@ -56,6 +72,8 @@ export function runDatasetImportLcaConvert(options) {
|
|
|
56
72
|
? path.join(outputDir, 'ilcd')
|
|
57
73
|
: null,
|
|
58
74
|
mapping_csv: options.detectOnly ? null : path.join(outputDir, 'mapping.csv'),
|
|
75
|
+
process_bundles_dir: processBundles ? processBundlesDir : null,
|
|
76
|
+
process_bundles_index: processBundles ? path.join(processBundlesDir, 'index.json') : null,
|
|
59
77
|
};
|
|
60
78
|
const report = {
|
|
61
79
|
schema_version: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-import-lca.js","sourceRoot":"","sources":["../../../src/lib/dataset-import-lca.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { spawnSync, type SpawnSyncReturns } from 'node:child_process';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\n\nexport type DatasetImportLcaTarget = 'tidas' | 'ilcd' | 'both';\n\nexport type DatasetImportLcaReport = {\n schema_version: 1;\n status: 'completed' | 'blocked';\n generated_at_utc: string;\n input_path: string;\n output_dir: string;\n from_format: string;\n target: DatasetImportLcaTarget;\n detect_only: boolean;\n command: {\n executable: string;\n args: string[];\n cwd: string;\n exit_code: number | null;\n stdout: string;\n stderr: string;\n };\n conversion_report: unknown | null;\n files: {\n report: string;\n conversion_report: string;\n tidas_dir: string | null;\n ilcd_dir: string | null;\n mapping_csv: string | null;\n };\n};\n\nexport type RunDatasetImportLcaConvertOptions = {\n inputPath: string;\n outputDir: string;\n fromFormat?: string | undefined;\n target?: string | undefined;\n language?: string | undefined;\n reportPath?: string | undefined;\n mappingDir?: string | undefined;\n failOnWarning?: boolean | undefined;\n validationJobs?: number | undefined;\n detectOnly?: boolean | undefined;\n pythonBin?: string | undefined;\n tidasToolsDir?: string | undefined;\n env?: NodeJS.ProcessEnv | undefined;\n now?: Date | undefined;\n spawnImpl?: typeof spawnSync | undefined;\n};\n\nexport function runDatasetImportLcaConvert(\n options: RunDatasetImportLcaConvertOptions,\n): DatasetImportLcaReport {\n const inputPath = requireInputPath(options.inputPath);\n const outputDir = requireOutputDir(options.outputDir);\n const target = normalizeTarget(options.target);\n const fromFormat = options.fromFormat?.trim() || 'auto';\n const pythonBin = options.pythonBin?.trim() || 'python3';\n const tidasToolsRoot = resolveTidasToolsRoot(options.tidasToolsDir, options.env ?? process.env);\n const reportPath = path.resolve(\n options.reportPath ?? path.join(outputDir, 'conversion-report.json'),\n );\n const commandArgs = [\n '-m',\n 'tidas_tools.import_lca.cli',\n '--input',\n inputPath,\n '--output-dir',\n outputDir,\n '--from-format',\n fromFormat,\n '--target',\n target,\n '--report',\n reportPath,\n '--language',\n options.language?.trim() || 'en',\n '--validation-jobs',\n String(options.validationJobs ?? 1),\n ];\n if (options.mappingDir) {\n commandArgs.push('--mapping-dir', path.resolve(options.mappingDir));\n }\n if (options.failOnWarning) {\n commandArgs.push('--fail-on-warning');\n }\n if (options.detectOnly) {\n commandArgs.push('--detect-only');\n }\n\n const run = (options.spawnImpl ?? spawnSync)(pythonBin, commandArgs, {\n cwd: tidasToolsRoot,\n env: {\n ...(options.env ?? process.env),\n PYTHONPATH: buildPythonPath(tidasToolsRoot, options.env ?? process.env),\n },\n encoding: 'utf8',\n }) as SpawnSyncReturns<string>;\n const conversionReport = readOptionalJson(reportPath);\n const files = {\n report: path.join(outputDir, 'outputs', 'import-lca-report.json'),\n conversion_report: reportPath,\n tidas_dir: options.detectOnly ? null : path.join(outputDir, 'tidas'),\n ilcd_dir:\n !options.detectOnly && (target === 'ilcd' || target === 'both')\n ? path.join(outputDir, 'ilcd')\n : null,\n mapping_csv: options.detectOnly ? null : path.join(outputDir, 'mapping.csv'),\n };\n const report: DatasetImportLcaReport = {\n schema_version: 1,\n status: run.status === 0 ? 'completed' : 'blocked',\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n input_path: inputPath,\n output_dir: outputDir,\n from_format: fromFormat,\n target,\n detect_only: Boolean(options.detectOnly),\n command: {\n executable: pythonBin,\n args: commandArgs,\n cwd: tidasToolsRoot,\n exit_code: run.status,\n stdout: run.stdout ?? '',\n stderr: run.stderr ?? '',\n },\n conversion_report: conversionReport,\n files,\n };\n\n writeJsonArtifact(files.report, report);\n return report;\n}\n\nfunction requireInputPath(value: string): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --input value.', {\n code: 'DATASET_IMPORT_LCA_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n const resolved = path.resolve(value);\n if (!existsSync(resolved)) {\n throw new CliError(`Input path not found: ${resolved}`, {\n code: 'DATASET_IMPORT_LCA_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved;\n}\n\nfunction requireOutputDir(value: string): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --output-dir value.', {\n code: 'DATASET_IMPORT_LCA_OUTPUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(value);\n}\n\nfunction normalizeTarget(value: string | undefined): DatasetImportLcaTarget {\n const target = value?.trim() || 'tidas';\n if (target === 'tidas' || target === 'ilcd' || target === 'both') {\n return target;\n }\n throw new CliError(\"--target must be 'tidas', 'ilcd', or 'both'.\", {\n code: 'DATASET_IMPORT_LCA_TARGET_INVALID',\n exitCode: 2,\n });\n}\n\nfunction resolveTidasToolsRoot(\n explicitValue: string | undefined,\n env: NodeJS.ProcessEnv,\n defaultCandidate?: string,\n): string {\n const cliRepoRoot = resolveCliRepoRoot();\n if (explicitValue?.trim()) {\n const resolved = path.resolve(explicitValue);\n if (existsSync(path.join(resolved, 'src/tidas_tools/import_lca/cli.py'))) {\n return resolved;\n }\n throw new CliError('Could not resolve a tidas-tools checkout for dataset import.', {\n code: 'DATASET_IMPORT_LCA_TIDAS_TOOLS_NOT_FOUND',\n exitCode: 2,\n details: { candidates: [explicitValue] },\n });\n }\n\n const candidates = [\n env.TIDAS_TOOLS_DIR,\n env.TIDAS_TOOLS_PATH,\n defaultCandidate ?? path.resolve(cliRepoRoot, '../tidas-tools'),\n ].filter((candidate): candidate is string => Boolean(candidate?.trim()));\n\n for (const candidate of candidates) {\n const resolved = path.resolve(candidate);\n if (existsSync(path.join(resolved, 'src/tidas_tools/import_lca/cli.py'))) {\n return resolved;\n }\n }\n\n throw new CliError('Could not resolve a tidas-tools checkout for dataset import.', {\n code: 'DATASET_IMPORT_LCA_TIDAS_TOOLS_NOT_FOUND',\n exitCode: 2,\n details: { candidates },\n });\n}\n\nfunction resolveCliRepoRoot(candidatesOverride?: string[]): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(moduleDir, '../..'),\n path.resolve(moduleDir, '../../..'),\n ];\n return (\n candidates.find(\n (candidate) =>\n existsSync(path.join(candidate, 'package.json')) &&\n existsSync(path.join(candidate, 'src/cli.ts')),\n ) ?? candidates[0]\n );\n}\n\nfunction buildPythonPath(tidasToolsRoot: string, env: NodeJS.ProcessEnv): string {\n return [path.join(tidasToolsRoot, 'src'), env.PYTHONPATH].filter(Boolean).join(path.delimiter);\n}\n\nfunction readOptionalJson(filePath: string): unknown | null {\n if (!existsSync(filePath)) {\n return null;\n }\n return JSON.parse(readFileSync(filePath, 'utf8'));\n}\n\nexport const __testInternals = {\n normalizeTarget,\n resolveCliRepoRoot,\n resolveTidasToolsRoot,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"dataset-import-lca.js","sourceRoot":"","sources":["../../../src/lib/dataset-import-lca.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { spawnSync, type SpawnSyncReturns } from 'node:child_process';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\n\nexport type DatasetImportLcaTarget = 'tidas' | 'ilcd' | 'both';\n\nexport type DatasetImportLcaReport = {\n schema_version: 1;\n status: 'completed' | 'blocked';\n generated_at_utc: string;\n input_path: string;\n output_dir: string;\n from_format: string;\n target: DatasetImportLcaTarget;\n detect_only: boolean;\n command: {\n executable: string;\n args: string[];\n cwd: string;\n exit_code: number | null;\n stdout: string;\n stderr: string;\n };\n conversion_report: unknown | null;\n files: {\n report: string;\n conversion_report: string;\n tidas_dir: string | null;\n ilcd_dir: string | null;\n mapping_csv: string | null;\n process_bundles_dir: string | null;\n process_bundles_index: string | null;\n };\n};\n\nexport type RunDatasetImportLcaConvertOptions = {\n inputPath: string;\n outputDir: string;\n fromFormat?: string | undefined;\n target?: string | undefined;\n language?: string | undefined;\n reportPath?: string | undefined;\n mappingDir?: string | undefined;\n failOnWarning?: boolean | undefined;\n validationJobs?: number | undefined;\n processBundles?: boolean | undefined;\n processBundlesDir?: string | undefined;\n detectOnly?: boolean | undefined;\n pythonBin?: string | undefined;\n tidasToolsDir?: string | undefined;\n env?: NodeJS.ProcessEnv | undefined;\n now?: Date | undefined;\n spawnImpl?: typeof spawnSync | undefined;\n};\n\nexport function runDatasetImportLcaConvert(\n options: RunDatasetImportLcaConvertOptions,\n): DatasetImportLcaReport {\n const inputPath = requireInputPath(options.inputPath);\n const outputDir = requireOutputDir(options.outputDir);\n const target = normalizeTarget(options.target);\n const fromFormat = options.fromFormat?.trim() || 'auto';\n const pythonBin = options.pythonBin?.trim() || 'python3';\n const tidasToolsRoot = resolveTidasToolsRoot(options.tidasToolsDir, options.env ?? process.env);\n const processBundlesDir = options.processBundlesDir\n ? path.resolve(options.processBundlesDir)\n : path.join(outputDir, 'process-bundles');\n const processBundles = !options.detectOnly && options.processBundles !== false;\n if (options.processBundles === false && options.processBundlesDir?.trim()) {\n throw new CliError('--process-bundles-dir cannot be used with --no-process-bundles.', {\n code: 'DATASET_IMPORT_LCA_PROCESS_BUNDLES_INVALID',\n exitCode: 2,\n });\n }\n const reportPath = path.resolve(\n options.reportPath ?? path.join(outputDir, 'conversion-report.json'),\n );\n const commandArgs = [\n '-m',\n 'tidas_tools.import_lca.cli',\n '--input',\n inputPath,\n '--output-dir',\n outputDir,\n '--from-format',\n fromFormat,\n '--target',\n target,\n '--report',\n reportPath,\n '--language',\n options.language?.trim() || 'en',\n '--validation-jobs',\n String(options.validationJobs ?? 1),\n ];\n if (options.mappingDir) {\n commandArgs.push('--mapping-dir', path.resolve(options.mappingDir));\n }\n if (options.failOnWarning) {\n commandArgs.push('--fail-on-warning');\n }\n if (!options.detectOnly && (processBundles || options.processBundlesDir?.trim())) {\n commandArgs.push('--process-bundles');\n }\n if (!options.detectOnly && options.processBundlesDir?.trim()) {\n commandArgs.push('--process-bundles-dir', processBundlesDir);\n }\n if (options.detectOnly) {\n commandArgs.push('--detect-only');\n }\n\n const run = (options.spawnImpl ?? spawnSync)(pythonBin, commandArgs, {\n cwd: tidasToolsRoot,\n env: {\n ...(options.env ?? process.env),\n PYTHONPATH: buildPythonPath(tidasToolsRoot, options.env ?? process.env),\n },\n encoding: 'utf8',\n }) as SpawnSyncReturns<string>;\n const conversionReport = readOptionalJson(reportPath);\n const files = {\n report: path.join(outputDir, 'outputs', 'import-lca-report.json'),\n conversion_report: reportPath,\n tidas_dir: options.detectOnly ? null : path.join(outputDir, 'tidas'),\n ilcd_dir:\n !options.detectOnly && (target === 'ilcd' || target === 'both')\n ? path.join(outputDir, 'ilcd')\n : null,\n mapping_csv: options.detectOnly ? null : path.join(outputDir, 'mapping.csv'),\n process_bundles_dir: processBundles ? processBundlesDir : null,\n process_bundles_index: processBundles ? path.join(processBundlesDir, 'index.json') : null,\n };\n const report: DatasetImportLcaReport = {\n schema_version: 1,\n status: run.status === 0 ? 'completed' : 'blocked',\n generated_at_utc: (options.now ?? new Date()).toISOString(),\n input_path: inputPath,\n output_dir: outputDir,\n from_format: fromFormat,\n target,\n detect_only: Boolean(options.detectOnly),\n command: {\n executable: pythonBin,\n args: commandArgs,\n cwd: tidasToolsRoot,\n exit_code: run.status,\n stdout: run.stdout ?? '',\n stderr: run.stderr ?? '',\n },\n conversion_report: conversionReport,\n files,\n };\n\n writeJsonArtifact(files.report, report);\n return report;\n}\n\nfunction requireInputPath(value: string): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --input value.', {\n code: 'DATASET_IMPORT_LCA_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n const resolved = path.resolve(value);\n if (!existsSync(resolved)) {\n throw new CliError(`Input path not found: ${resolved}`, {\n code: 'DATASET_IMPORT_LCA_INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n return resolved;\n}\n\nfunction requireOutputDir(value: string): string {\n if (!value?.trim()) {\n throw new CliError('Missing required --output-dir value.', {\n code: 'DATASET_IMPORT_LCA_OUTPUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n return path.resolve(value);\n}\n\nfunction normalizeTarget(value: string | undefined): DatasetImportLcaTarget {\n const target = value?.trim() || 'tidas';\n if (target === 'tidas' || target === 'ilcd' || target === 'both') {\n return target;\n }\n throw new CliError(\"--target must be 'tidas', 'ilcd', or 'both'.\", {\n code: 'DATASET_IMPORT_LCA_TARGET_INVALID',\n exitCode: 2,\n });\n}\n\nfunction resolveTidasToolsRoot(\n explicitValue: string | undefined,\n env: NodeJS.ProcessEnv,\n defaultCandidate?: string,\n): string {\n const cliRepoRoot = resolveCliRepoRoot();\n if (explicitValue?.trim()) {\n const resolved = path.resolve(explicitValue);\n if (existsSync(path.join(resolved, 'src/tidas_tools/import_lca/cli.py'))) {\n return resolved;\n }\n throw new CliError('Could not resolve a tidas-tools checkout for dataset import.', {\n code: 'DATASET_IMPORT_LCA_TIDAS_TOOLS_NOT_FOUND',\n exitCode: 2,\n details: { candidates: [explicitValue] },\n });\n }\n\n const candidates = [\n env.TIDAS_TOOLS_DIR,\n env.TIDAS_TOOLS_PATH,\n defaultCandidate ?? path.resolve(cliRepoRoot, '../tidas-tools'),\n ].filter((candidate): candidate is string => Boolean(candidate?.trim()));\n\n for (const candidate of candidates) {\n const resolved = path.resolve(candidate);\n if (existsSync(path.join(resolved, 'src/tidas_tools/import_lca/cli.py'))) {\n return resolved;\n }\n }\n\n throw new CliError('Could not resolve a tidas-tools checkout for dataset import.', {\n code: 'DATASET_IMPORT_LCA_TIDAS_TOOLS_NOT_FOUND',\n exitCode: 2,\n details: { candidates },\n });\n}\n\nfunction resolveCliRepoRoot(candidatesOverride?: string[]): string {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = candidatesOverride ?? [\n path.resolve(moduleDir, '../..'),\n path.resolve(moduleDir, '../../..'),\n ];\n return (\n candidates.find(\n (candidate) =>\n existsSync(path.join(candidate, 'package.json')) &&\n existsSync(path.join(candidate, 'src/cli.ts')),\n ) ?? candidates[0]\n );\n}\n\nfunction buildPythonPath(tidasToolsRoot: string, env: NodeJS.ProcessEnv): string {\n return [path.join(tidasToolsRoot, 'src'), env.PYTHONPATH].filter(Boolean).join(path.delimiter);\n}\n\nfunction readOptionalJson(filePath: string): unknown | null {\n if (!existsSync(filePath)) {\n return null;\n }\n return JSON.parse(readFileSync(filePath, 'utf8'));\n}\n\nexport const __testInternals = {\n normalizeTarget,\n resolveCliRepoRoot,\n resolveTidasToolsRoot,\n};\n"]}
|
|
@@ -86,34 +86,70 @@ export function readDatasetRowsInput(inputPath, rawInput) {
|
|
|
86
86
|
: normalizeStructuredRows(readJsonInput(resolved), resolved);
|
|
87
87
|
}
|
|
88
88
|
export function datasetRoot(payload, kind) {
|
|
89
|
+
if (kind === 'contact') {
|
|
90
|
+
return isRecord(payload.contactDataSet) ? payload.contactDataSet : payload;
|
|
91
|
+
}
|
|
89
92
|
if (kind === 'flow') {
|
|
90
93
|
return isRecord(payload.flowDataSet) ? payload.flowDataSet : payload;
|
|
91
94
|
}
|
|
95
|
+
if (kind === 'flowproperty') {
|
|
96
|
+
return isRecord(payload.flowPropertyDataSet) ? payload.flowPropertyDataSet : payload;
|
|
97
|
+
}
|
|
92
98
|
if (kind === 'process') {
|
|
93
99
|
return isRecord(payload.processDataSet) ? payload.processDataSet : payload;
|
|
94
100
|
}
|
|
95
|
-
|
|
101
|
+
if (kind === 'lifecyclemodel') {
|
|
102
|
+
return isRecord(payload.lifeCycleModelDataSet) ? payload.lifeCycleModelDataSet : payload;
|
|
103
|
+
}
|
|
104
|
+
if (kind === 'source') {
|
|
105
|
+
return isRecord(payload.sourceDataSet) ? payload.sourceDataSet : payload;
|
|
106
|
+
}
|
|
107
|
+
return isRecord(payload.unitGroupDataSet) ? payload.unitGroupDataSet : payload;
|
|
96
108
|
}
|
|
97
109
|
export function detectDatasetKind(value) {
|
|
98
110
|
const payload = unwrapDatasetPayload(value);
|
|
111
|
+
if (isRecord(payload.contactDataSet)) {
|
|
112
|
+
return 'contact';
|
|
113
|
+
}
|
|
99
114
|
if (isRecord(payload.flowDataSet)) {
|
|
100
115
|
return 'flow';
|
|
101
116
|
}
|
|
117
|
+
if (isRecord(payload.flowPropertyDataSet)) {
|
|
118
|
+
return 'flowproperty';
|
|
119
|
+
}
|
|
102
120
|
if (isRecord(payload.processDataSet)) {
|
|
103
121
|
return 'process';
|
|
104
122
|
}
|
|
105
123
|
if (isRecord(payload.lifeCycleModelDataSet)) {
|
|
106
124
|
return 'lifecyclemodel';
|
|
107
125
|
}
|
|
126
|
+
if (isRecord(payload.sourceDataSet)) {
|
|
127
|
+
return 'source';
|
|
128
|
+
}
|
|
129
|
+
if (isRecord(payload.unitGroupDataSet)) {
|
|
130
|
+
return 'unitgroup';
|
|
131
|
+
}
|
|
132
|
+
if (isRecord(value.contact)) {
|
|
133
|
+
return 'contact';
|
|
134
|
+
}
|
|
108
135
|
if (isRecord(value.flow)) {
|
|
109
136
|
return 'flow';
|
|
110
137
|
}
|
|
138
|
+
if (isRecord(value.flowproperty)) {
|
|
139
|
+
return 'flowproperty';
|
|
140
|
+
}
|
|
111
141
|
if (isRecord(value.process)) {
|
|
112
142
|
return 'process';
|
|
113
143
|
}
|
|
114
144
|
if (isRecord(value.lifecyclemodel)) {
|
|
115
145
|
return 'lifecyclemodel';
|
|
116
146
|
}
|
|
147
|
+
if (isRecord(value.source)) {
|
|
148
|
+
return 'source';
|
|
149
|
+
}
|
|
150
|
+
if (isRecord(value.unitgroup)) {
|
|
151
|
+
return 'unitgroup';
|
|
152
|
+
}
|
|
117
153
|
return null;
|
|
118
154
|
}
|
|
119
155
|
export function unwrapDatasetPayload(row) {
|
|
@@ -131,8 +167,37 @@ export function unwrapDatasetPayload(row) {
|
|
|
131
167
|
if (isRecord(row.lifecyclemodel)) {
|
|
132
168
|
return row.lifecyclemodel;
|
|
133
169
|
}
|
|
170
|
+
if (isRecord(row.contact)) {
|
|
171
|
+
return row.contact;
|
|
172
|
+
}
|
|
173
|
+
if (isRecord(row.source)) {
|
|
174
|
+
return row.source;
|
|
175
|
+
}
|
|
176
|
+
if (isRecord(row.unitgroup)) {
|
|
177
|
+
return row.unitgroup;
|
|
178
|
+
}
|
|
179
|
+
if (isRecord(row.flowproperty)) {
|
|
180
|
+
return row.flowproperty;
|
|
181
|
+
}
|
|
134
182
|
return row;
|
|
135
183
|
}
|
|
184
|
+
function genericIdentity(payload, kind, informationKey) {
|
|
185
|
+
const root = datasetRoot(payload, kind);
|
|
186
|
+
const information = isRecord(root[informationKey]) ? root[informationKey] : {};
|
|
187
|
+
const dataSetInformation = isRecord(information.dataSetInformation)
|
|
188
|
+
? information.dataSetInformation
|
|
189
|
+
: {};
|
|
190
|
+
const administrativeInformation = isRecord(root.administrativeInformation)
|
|
191
|
+
? root.administrativeInformation
|
|
192
|
+
: {};
|
|
193
|
+
const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)
|
|
194
|
+
? administrativeInformation.publicationAndOwnership
|
|
195
|
+
: {};
|
|
196
|
+
return {
|
|
197
|
+
id: firstNonEmpty(dataSetInformation['common:UUID']),
|
|
198
|
+
version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
136
201
|
function flowIdentity(payload) {
|
|
137
202
|
const root = datasetRoot(payload, 'flow');
|
|
138
203
|
const information = isRecord(root.flowInformation) ? root.flowInformation : {};
|
|
@@ -187,6 +252,13 @@ function lifecyclemodelIdentity(payload) {
|
|
|
187
252
|
};
|
|
188
253
|
}
|
|
189
254
|
export function datasetIdentity(row, payload, kind) {
|
|
255
|
+
if (kind === 'contact') {
|
|
256
|
+
const identity = genericIdentity(payload, 'contact', 'contactInformation');
|
|
257
|
+
return {
|
|
258
|
+
id: firstNonEmpty(row.id, identity.id),
|
|
259
|
+
version: firstNonEmpty(row.version, identity.version),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
190
262
|
if (kind === 'flow') {
|
|
191
263
|
const identity = flowIdentity(payload);
|
|
192
264
|
return {
|
|
@@ -194,6 +266,13 @@ export function datasetIdentity(row, payload, kind) {
|
|
|
194
266
|
version: firstNonEmpty(row.version, identity.version),
|
|
195
267
|
};
|
|
196
268
|
}
|
|
269
|
+
if (kind === 'flowproperty') {
|
|
270
|
+
const identity = genericIdentity(payload, 'flowproperty', 'flowPropertiesInformation');
|
|
271
|
+
return {
|
|
272
|
+
id: firstNonEmpty(row.id, identity.id),
|
|
273
|
+
version: firstNonEmpty(row.version, identity.version),
|
|
274
|
+
};
|
|
275
|
+
}
|
|
197
276
|
if (kind === 'process') {
|
|
198
277
|
const identity = processIdentity(payload);
|
|
199
278
|
return {
|
|
@@ -208,6 +287,20 @@ export function datasetIdentity(row, payload, kind) {
|
|
|
208
287
|
version: firstNonEmpty(row.version, identity.version),
|
|
209
288
|
};
|
|
210
289
|
}
|
|
290
|
+
if (kind === 'source') {
|
|
291
|
+
const identity = genericIdentity(payload, 'source', 'sourceInformation');
|
|
292
|
+
return {
|
|
293
|
+
id: firstNonEmpty(row.id, identity.id),
|
|
294
|
+
version: firstNonEmpty(row.version, identity.version),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
if (kind === 'unitgroup') {
|
|
298
|
+
const identity = genericIdentity(payload, 'unitgroup', 'unitGroupInformation');
|
|
299
|
+
return {
|
|
300
|
+
id: firstNonEmpty(row.id, identity.id),
|
|
301
|
+
version: firstNonEmpty(row.version, identity.version),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
211
304
|
return {
|
|
212
305
|
id: firstNonEmpty(row.id),
|
|
213
306
|
version: firstNonEmpty(row.version),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-local.js","sourceRoot":"","sources":["../../../src/lib/dataset-local.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport { readJsonInput } from './io.js';\n\nexport type JsonObject = Record<string, unknown>;\n\nexport type DatasetKind = 'flow' | 'process' | 'lifecyclemodel';\n\nexport type DatasetRowInput = {\n index: number;\n row: JsonObject;\n payload: JsonObject;\n kind: DatasetKind | null;\n id: string | null;\n version: string | null;\n};\n\nexport function isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nexport function trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nexport function firstNonEmpty(...values: unknown[]): string | null {\n for (const value of values) {\n const token = trimToken(value);\n if (token) {\n return token;\n }\n }\n return null;\n}\n\nfunction readJsonLinesInput(inputPath: string): JsonObject[] {\n const resolved = path.resolve(inputPath);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: 'INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readFileSync(resolved, 'utf8')\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (error) {\n throw new CliError(`Input file contains invalid JSONL at line ${index + 1}: ${resolved}`, {\n code: 'INPUT_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n if (!isRecord(parsed)) {\n throw new CliError(\n `Expected JSON object rows in JSONL input: ${resolved} (line ${index + 1})`,\n {\n code: 'INPUT_INVALID_JSONL_ROW',\n exitCode: 2,\n },\n );\n }\n return parsed;\n });\n}\n\nfunction normalizeStructuredRows(value: unknown, inputPath: string): JsonObject[] {\n const rows = isRecord(value) && Array.isArray(value.rows) ? value.rows : value;\n const normalizedRows = Array.isArray(rows) ? rows : [rows];\n return normalizedRows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected JSON object rows in dataset input: ${inputPath} (index ${index})`,\n {\n code: 'DATASET_INPUT_INVALID_ROW',\n exitCode: 2,\n },\n );\n }\n return row;\n });\n}\n\nexport function readDatasetRowsInput(inputPath: string, rawInput?: unknown): JsonObject[] {\n if (!inputPath) {\n throw new CliError('Missing required --input value.', {\n code: 'DATASET_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n\n if (rawInput !== undefined) {\n return normalizeStructuredRows(rawInput, inputPath);\n }\n\n const resolved = path.resolve(inputPath);\n return resolved.toLowerCase().endsWith('.jsonl')\n ? readJsonLinesInput(resolved)\n : normalizeStructuredRows(readJsonInput(resolved), resolved);\n}\n\nexport function datasetRoot(payload: JsonObject, kind: DatasetKind): JsonObject {\n if (kind === 'flow') {\n return isRecord(payload.flowDataSet) ? payload.flowDataSet : payload;\n }\n if (kind === 'process') {\n return isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n }\n return isRecord(payload.lifeCycleModelDataSet) ? payload.lifeCycleModelDataSet : payload;\n}\n\nexport function detectDatasetKind(value: JsonObject): DatasetKind | null {\n const payload = unwrapDatasetPayload(value);\n if (isRecord(payload.flowDataSet)) {\n return 'flow';\n }\n if (isRecord(payload.processDataSet)) {\n return 'process';\n }\n if (isRecord(payload.lifeCycleModelDataSet)) {\n return 'lifecyclemodel';\n }\n if (isRecord(value.flow)) {\n return 'flow';\n }\n if (isRecord(value.process)) {\n return 'process';\n }\n if (isRecord(value.lifecyclemodel)) {\n return 'lifecyclemodel';\n }\n return null;\n}\n\nexport function unwrapDatasetPayload(row: JsonObject): JsonObject {\n for (const key of ['json_ordered', 'jsonOrdered', 'json', 'payload'] as const) {\n if (isRecord(row[key])) {\n return row[key];\n }\n }\n if (isRecord(row.flow)) {\n return row.flow;\n }\n if (isRecord(row.process)) {\n return row.process;\n }\n if (isRecord(row.lifecyclemodel)) {\n return row.lifecyclemodel;\n }\n return row;\n}\n\nfunction flowIdentity(payload: JsonObject): { id: string | null; version: string | null } {\n const root = datasetRoot(payload, 'flow');\n const information = isRecord(root.flowInformation) ? root.flowInformation : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction processIdentity(payload: JsonObject): { id: string | null; version: string | null } {\n const root = datasetRoot(payload, 'process');\n const information = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction lifecyclemodelIdentity(payload: JsonObject): {\n id: string | null;\n version: string | null;\n} {\n const root = datasetRoot(payload, 'lifecyclemodel');\n const information = isRecord(root.lifeCycleModelInformation)\n ? root.lifeCycleModelInformation\n : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nexport function datasetIdentity(\n row: JsonObject,\n payload: JsonObject,\n kind: DatasetKind | null,\n): { id: string | null; version: string | null } {\n if (kind === 'flow') {\n const identity = flowIdentity(payload);\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'process') {\n const identity = processIdentity(payload);\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'lifecyclemodel') {\n const identity = lifecyclemodelIdentity(payload);\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n return {\n id: firstNonEmpty(row.id),\n version: firstNonEmpty(row.version),\n };\n}\n\nexport function materializeDatasetRows(inputPath: string, rawInput?: unknown): DatasetRowInput[] {\n return readDatasetRowsInput(inputPath, rawInput).map((row, index) => {\n const payload = unwrapDatasetPayload(row);\n const kind = detectDatasetKind(row);\n const identity = datasetIdentity(row, payload, kind);\n return {\n index,\n row,\n payload,\n kind,\n id: identity.id,\n version: identity.version,\n };\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dataset-local.js","sourceRoot":"","sources":["../../../src/lib/dataset-local.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { CliError } from './errors.js';\nimport { readJsonInput } from './io.js';\n\nexport type JsonObject = Record<string, unknown>;\n\nexport type DatasetKind =\n | 'contact'\n | 'flow'\n | 'flowproperty'\n | 'lifecyclemodel'\n | 'process'\n | 'source'\n | 'unitgroup';\n\nexport type DatasetRowInput = {\n index: number;\n row: JsonObject;\n payload: JsonObject;\n kind: DatasetKind | null;\n id: string | null;\n version: string | null;\n};\n\nexport function isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nexport function trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nexport function firstNonEmpty(...values: unknown[]): string | null {\n for (const value of values) {\n const token = trimToken(value);\n if (token) {\n return token;\n }\n }\n return null;\n}\n\nfunction readJsonLinesInput(inputPath: string): JsonObject[] {\n const resolved = path.resolve(inputPath);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code: 'INPUT_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readFileSync(resolved, 'utf8')\n .split(/\\r?\\n/u)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (error) {\n throw new CliError(`Input file contains invalid JSONL at line ${index + 1}: ${resolved}`, {\n code: 'INPUT_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n if (!isRecord(parsed)) {\n throw new CliError(\n `Expected JSON object rows in JSONL input: ${resolved} (line ${index + 1})`,\n {\n code: 'INPUT_INVALID_JSONL_ROW',\n exitCode: 2,\n },\n );\n }\n return parsed;\n });\n}\n\nfunction normalizeStructuredRows(value: unknown, inputPath: string): JsonObject[] {\n const rows = isRecord(value) && Array.isArray(value.rows) ? value.rows : value;\n const normalizedRows = Array.isArray(rows) ? rows : [rows];\n return normalizedRows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected JSON object rows in dataset input: ${inputPath} (index ${index})`,\n {\n code: 'DATASET_INPUT_INVALID_ROW',\n exitCode: 2,\n },\n );\n }\n return row;\n });\n}\n\nexport function readDatasetRowsInput(inputPath: string, rawInput?: unknown): JsonObject[] {\n if (!inputPath) {\n throw new CliError('Missing required --input value.', {\n code: 'DATASET_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n\n if (rawInput !== undefined) {\n return normalizeStructuredRows(rawInput, inputPath);\n }\n\n const resolved = path.resolve(inputPath);\n return resolved.toLowerCase().endsWith('.jsonl')\n ? readJsonLinesInput(resolved)\n : normalizeStructuredRows(readJsonInput(resolved), resolved);\n}\n\nexport function datasetRoot(payload: JsonObject, kind: DatasetKind): JsonObject {\n if (kind === 'contact') {\n return isRecord(payload.contactDataSet) ? payload.contactDataSet : payload;\n }\n if (kind === 'flow') {\n return isRecord(payload.flowDataSet) ? payload.flowDataSet : payload;\n }\n if (kind === 'flowproperty') {\n return isRecord(payload.flowPropertyDataSet) ? payload.flowPropertyDataSet : payload;\n }\n if (kind === 'process') {\n return isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n }\n if (kind === 'lifecyclemodel') {\n return isRecord(payload.lifeCycleModelDataSet) ? payload.lifeCycleModelDataSet : payload;\n }\n if (kind === 'source') {\n return isRecord(payload.sourceDataSet) ? payload.sourceDataSet : payload;\n }\n return isRecord(payload.unitGroupDataSet) ? payload.unitGroupDataSet : payload;\n}\n\nexport function detectDatasetKind(value: JsonObject): DatasetKind | null {\n const payload = unwrapDatasetPayload(value);\n if (isRecord(payload.contactDataSet)) {\n return 'contact';\n }\n if (isRecord(payload.flowDataSet)) {\n return 'flow';\n }\n if (isRecord(payload.flowPropertyDataSet)) {\n return 'flowproperty';\n }\n if (isRecord(payload.processDataSet)) {\n return 'process';\n }\n if (isRecord(payload.lifeCycleModelDataSet)) {\n return 'lifecyclemodel';\n }\n if (isRecord(payload.sourceDataSet)) {\n return 'source';\n }\n if (isRecord(payload.unitGroupDataSet)) {\n return 'unitgroup';\n }\n if (isRecord(value.contact)) {\n return 'contact';\n }\n if (isRecord(value.flow)) {\n return 'flow';\n }\n if (isRecord(value.flowproperty)) {\n return 'flowproperty';\n }\n if (isRecord(value.process)) {\n return 'process';\n }\n if (isRecord(value.lifecyclemodel)) {\n return 'lifecyclemodel';\n }\n if (isRecord(value.source)) {\n return 'source';\n }\n if (isRecord(value.unitgroup)) {\n return 'unitgroup';\n }\n return null;\n}\n\nexport function unwrapDatasetPayload(row: JsonObject): JsonObject {\n for (const key of ['json_ordered', 'jsonOrdered', 'json', 'payload'] as const) {\n if (isRecord(row[key])) {\n return row[key];\n }\n }\n if (isRecord(row.flow)) {\n return row.flow;\n }\n if (isRecord(row.process)) {\n return row.process;\n }\n if (isRecord(row.lifecyclemodel)) {\n return row.lifecyclemodel;\n }\n if (isRecord(row.contact)) {\n return row.contact;\n }\n if (isRecord(row.source)) {\n return row.source;\n }\n if (isRecord(row.unitgroup)) {\n return row.unitgroup;\n }\n if (isRecord(row.flowproperty)) {\n return row.flowproperty;\n }\n return row;\n}\n\nfunction genericIdentity(\n payload: JsonObject,\n kind: DatasetKind,\n informationKey: string,\n): { id: string | null; version: string | null } {\n const root = datasetRoot(payload, kind);\n const information = isRecord(root[informationKey]) ? root[informationKey] : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction flowIdentity(payload: JsonObject): { id: string | null; version: string | null } {\n const root = datasetRoot(payload, 'flow');\n const information = isRecord(root.flowInformation) ? root.flowInformation : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction processIdentity(payload: JsonObject): { id: string | null; version: string | null } {\n const root = datasetRoot(payload, 'process');\n const information = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nfunction lifecyclemodelIdentity(payload: JsonObject): {\n id: string | null;\n version: string | null;\n} {\n const root = datasetRoot(payload, 'lifecyclemodel');\n const information = isRecord(root.lifeCycleModelInformation)\n ? root.lifeCycleModelInformation\n : {};\n const dataSetInformation = isRecord(information.dataSetInformation)\n ? information.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n return {\n id: firstNonEmpty(dataSetInformation['common:UUID']),\n version: firstNonEmpty(publicationAndOwnership['common:dataSetVersion']),\n };\n}\n\nexport function datasetIdentity(\n row: JsonObject,\n payload: JsonObject,\n kind: DatasetKind | null,\n): { id: string | null; version: string | null } {\n if (kind === 'contact') {\n const identity = genericIdentity(payload, 'contact', 'contactInformation');\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'flow') {\n const identity = flowIdentity(payload);\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'flowproperty') {\n const identity = genericIdentity(payload, 'flowproperty', 'flowPropertiesInformation');\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'process') {\n const identity = processIdentity(payload);\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'lifecyclemodel') {\n const identity = lifecyclemodelIdentity(payload);\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'source') {\n const identity = genericIdentity(payload, 'source', 'sourceInformation');\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n if (kind === 'unitgroup') {\n const identity = genericIdentity(payload, 'unitgroup', 'unitGroupInformation');\n return {\n id: firstNonEmpty(row.id, identity.id),\n version: firstNonEmpty(row.version, identity.version),\n };\n }\n return {\n id: firstNonEmpty(row.id),\n version: firstNonEmpty(row.version),\n };\n}\n\nexport function materializeDatasetRows(inputPath: string, rawInput?: unknown): DatasetRowInput[] {\n return readDatasetRowsInput(inputPath, rawInput).map((row, index) => {\n const payload = unwrapDatasetPayload(row);\n const kind = detectDatasetKind(row);\n const identity = datasetIdentity(row, payload, kind);\n return {\n index,\n row,\n payload,\n kind,\n id: identity.id,\n version: identity.version,\n };\n });\n}\n"]}
|