@exercode/problem-utils 1.8.8 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=Array(t);e<t;e++)n[e]=r[e];return n}function t(r){if(Array.isArray(r))return r}function e(t){if(Array.isArray(t))return r(t)}function n(r,t,e,n,o,i,a){try{var u=r[i](a),c=u.value}catch(r){return void e(r)}u.done?t(c):Promise.resolve(c).then(n,o)}function o(r,t,e){return(t=s(t))in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function i(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function a(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,i,a,u=[],c=!0,f=!1;try{if(i=(e=e.call(r)).next,0===t);else for(;!(c=(n=i.call(e)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(r){f=!0,o=r}finally{try{if(!c&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(f)throw o}}return u}}function u(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(r,t){var e=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),e.push.apply(e,n)}return e}function l(){
1
+ "use strict";function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=Array(t);e<t;e++)n[e]=r[e];return n}function t(r){if(Array.isArray(r))return r}function e(t){if(Array.isArray(t))return r(t)}function n(r,t,e,n,o,i,a){try{var u=r[i](a),c=u.value}catch(r){return void e(r)}u.done?t(c):Promise.resolve(c).then(n,o)}function o(r,t,e){return(t=s(t))in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function i(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function a(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,i,a,u=[],c=!0,f=!1;try{if(i=(e=e.call(r)).next,0===t){if(Object(e)!==e)return;c=!1}else for(;!(c=(n=i.call(e)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(r){f=!0,o=r}finally{try{if(!c&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(f)throw o}}return u}}function u(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(r,t){var e=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),e.push.apply(e,n)}return e}function l(){
2
2
  /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
3
3
  var r,t,e="function"==typeof Symbol?Symbol:{},n=e.iterator||"@@iterator",o=e.toStringTag||"@@toStringTag";function i(e,n,o,i){var c=n&&n.prototype instanceof u?n:u,f=Object.create(c.prototype);return y(f,"_invoke",function(e,n,o){var i,u,c,f=0,l=o||[],y=!1,p={p:0,n:0,v:r,a:s,f:s.bind(r,4),d:function(t,e){return i=t,u=0,c=r,p.n=e,a}};function s(e,n){for(u=e,c=n,t=0;!y&&f&&!o&&t<l.length;t++){var o,i=l[t],s=p.p,b=i[2];e>3?(o=b===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=r):i[0]<=s&&((o=e<2&&s<i[1])?(u=0,p.v=n,p.n=i[1]):s<b&&(o=e<3||i[0]>n||n>b)&&(i[4]=e,i[5]=n,p.n=b,u=0))}if(o||e>1)return a;throw y=!0,n}return function(o,l,b){if(f>1)throw TypeError("Generator is already running");for(y&&1===l&&s(l,b),u=l,c=b;(t=u<2?r:c)||!y;){i||(u?u<3?(u>1&&(p.n=-1),s(u,c)):p.n=c:p.v=c);try{if(f=2,i){if(u||(o="next"),t=i[o]){if(!(t=t.call(i,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,u<2&&(u=0)}else 1===u&&(t=i.return)&&t.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=r}else if((t=(y=p.n<0)?c:e.call(n,p))!==a)break}catch(t){i=r,u=1,c=t}finally{f=1}}return{value:t,done:y}}}(e,o,i),!0),f}var a={};function u(){}function c(){}function f(){}t=Object.getPrototypeOf;var p=[][n]?t(t([][n]())):(y(t={},n,function(){return this}),t),s=f.prototype=u.prototype=Object.create(p);function b(r){return Object.setPrototypeOf?Object.setPrototypeOf(r,f):(r.__proto__=f,y(r,o,"GeneratorFunction")),r.prototype=Object.create(s),r}return c.prototype=f,y(s,"constructor",f),y(f,"constructor",c),c.displayName="GeneratorFunction",y(f,o,"GeneratorFunction"),y(s),y(s,o,"Generator"),y(s,n,function(){return this}),y(s,"toString",function(){return"[object Generator]"}),(l=function(){return{w:i,m:b}})()}function y(r,t,e,n){var o=Object.defineProperty;try{o({},"",{})}catch(r){o=0}y=function(r,t,e,n){function i(t,e){y(r,t,function(r){return this._invoke(t,e,r)})}t?o?o(r,t,{value:e,enumerable:!n,configurable:!n,writable:!n}):r[t]=e:(i("next",0),i("throw",1),i("return",2))},y(r,t,e,n)}function p(r,t){if("object"!=typeof r||!r)return r;var e=r[Symbol.toPrimitive];if(void 0!==e){var n=e.call(r,t);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(r)}function s(r){var t=p(r,"string");return"symbol"==typeof t?t:t+""}function b(r){"@babel/helpers - typeof";return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},b(r)}function v(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}exports.arrayLikeToArray=r,exports.arrayWithHoles=t,exports.arrayWithoutHoles=e,exports.asyncToGenerator=function(r){return function(){var t=this,e=arguments;return new Promise(function(o,i){var a=r.apply(t,e);function u(r){n(a,o,i,u,c,"next",r)}function c(r){n(a,o,i,u,c,"throw",r)}u(void 0)})}},exports.createForOfIteratorHelper=function(r,t){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!e){if(Array.isArray(r)||(e=v(r))||t&&r&&"number"==typeof r.length){e&&(r=e);var n=0,o=function(){};return{s:o,n:function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}},e:function(r){throw r},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){e=e.call(r)},n:function(){var r=e.next();return a=r.done,r},e:function(r){u=!0,i=r},f:function(){try{a||null==e.return||e.return()}finally{if(u)throw i}}}},exports.defineProperty=o,exports.iterableToArray=i,exports.iterableToArrayLimit=a,exports.nonIterableRest=u,exports.nonIterableSpread=c,exports.objectSpread2=function(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?f(Object(e),!0).forEach(function(t){o(r,t,e[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(e)):f(Object(e)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(e,t))})}return r},exports.regenerator=l,exports.regeneratorDefine=y,exports.regeneratorValues=function(r){if(null!=r){var t=r["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],e=0;if(t)return t.call(r);if("function"==typeof r.next)return r;if(!isNaN(r.length))return{next:function(){return r&&e>=r.length&&(r=void 0),{value:r&&r[e++],done:!r}}}}throw new TypeError(typeof r+" is not iterable")},exports.slicedToArray=function(r,e){return t(r)||a(r,e)||v(r,e)||u()},exports.toConsumableArray=function(r){return e(r)||i(r)||v(r)||c()},exports.toPrimitive=p,exports.toPropertyKey=s,exports.typeof=b,exports.unsupportedIterableToArray=v;
4
4
  //# sourceMappingURL=_rollupPluginBabelHelpers.cjs.map
@@ -1,4 +1,4 @@
1
- function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=Array(t);e<t;e++)n[e]=r[e];return n}function t(r){if(Array.isArray(r))return r}function e(t){if(Array.isArray(t))return r(t)}function n(r,t,e,n,o,i,a){try{var u=r[i](a),c=u.value}catch(r){return void e(r)}u.done?t(c):Promise.resolve(c).then(n,o)}function o(r){return function(){var t=this,e=arguments;return new Promise(function(o,i){var a=r.apply(t,e);function u(r){n(a,o,i,u,c,"next",r)}function c(r){n(a,o,i,u,c,"throw",r)}u(void 0)})}}function i(r,t){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!e){if(Array.isArray(r)||(e=j(r))||t&&r&&"number"==typeof r.length){e&&(r=e);var n=0,o=function(){};return{s:o,n:function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}},e:function(r){throw r},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){e=e.call(r)},n:function(){var r=e.next();return a=r.done,r},e:function(r){u=!0,i=r},f:function(){try{a||null==e.return||e.return()}finally{if(u)throw i}}}}function a(r,t,e){return(t=g(t))in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function u(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function c(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,i,a,u=[],c=!0,f=!1;try{if(i=(e=e.call(r)).next,0===t);else for(;!(c=(n=i.call(e)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(r){f=!0,o=r}finally{try{if(!c&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(f)throw o}}return u}}function f(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function y(r,t){var e=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),e.push.apply(e,n)}return e}function s(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?y(Object(e),!0).forEach(function(t){a(r,t,e[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(e)):y(Object(e)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(e,t))})}return r}function p(){
1
+ function r(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=Array(t);e<t;e++)n[e]=r[e];return n}function t(r){if(Array.isArray(r))return r}function e(t){if(Array.isArray(t))return r(t)}function n(r,t,e,n,o,i,a){try{var u=r[i](a),c=u.value}catch(r){return void e(r)}u.done?t(c):Promise.resolve(c).then(n,o)}function o(r){return function(){var t=this,e=arguments;return new Promise(function(o,i){var a=r.apply(t,e);function u(r){n(a,o,i,u,c,"next",r)}function c(r){n(a,o,i,u,c,"throw",r)}u(void 0)})}}function i(r,t){var e="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!e){if(Array.isArray(r)||(e=j(r))||t&&r&&"number"==typeof r.length){e&&(r=e);var n=0,o=function(){};return{s:o,n:function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]}},e:function(r){throw r},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){e=e.call(r)},n:function(){var r=e.next();return a=r.done,r},e:function(r){u=!0,i=r},f:function(){try{a||null==e.return||e.return()}finally{if(u)throw i}}}}function a(r,t,e){return(t=g(t))in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function u(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function c(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,i,a,u=[],c=!0,f=!1;try{if(i=(e=e.call(r)).next,0===t){if(Object(e)!==e)return;c=!1}else for(;!(c=(n=i.call(e)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(r){f=!0,o=r}finally{try{if(!c&&null!=e.return&&(a=e.return(),Object(a)!==a))return}finally{if(f)throw o}}return u}}function f(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function y(r,t){var e=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),e.push.apply(e,n)}return e}function s(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{};t%2?y(Object(e),!0).forEach(function(t){a(r,t,e[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(e)):y(Object(e)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(e,t))})}return r}function p(){
2
2
  /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
3
3
  var r,t,e="function"==typeof Symbol?Symbol:{},n=e.iterator||"@@iterator",o=e.toStringTag||"@@toStringTag";function i(e,n,o,i){var c=n&&n.prototype instanceof u?n:u,f=Object.create(c.prototype);return b(f,"_invoke",function(e,n,o){var i,u,c,f=0,l=o||[],y=!1,s={p:0,n:0,v:r,a:p,f:p.bind(r,4),d:function(t,e){return i=t,u=0,c=r,s.n=e,a}};function p(e,n){for(u=e,c=n,t=0;!y&&f&&!o&&t<l.length;t++){var o,i=l[t],p=s.p,b=i[2];e>3?(o=b===n)&&(c=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=r):i[0]<=p&&((o=e<2&&p<i[1])?(u=0,s.v=n,s.n=i[1]):p<b&&(o=e<3||i[0]>n||n>b)&&(i[4]=e,i[5]=n,s.n=b,u=0))}if(o||e>1)return a;throw y=!0,n}return function(o,l,b){if(f>1)throw TypeError("Generator is already running");for(y&&1===l&&p(l,b),u=l,c=b;(t=u<2?r:c)||!y;){i||(u?u<3?(u>1&&(s.n=-1),p(u,c)):s.n=c:s.v=c);try{if(f=2,i){if(u||(o="next"),t=i[o]){if(!(t=t.call(i,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,u<2&&(u=0)}else 1===u&&(t=i.return)&&t.call(i),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=r}else if((t=(y=s.n<0)?c:e.call(n,s))!==a)break}catch(t){i=r,u=1,c=t}finally{f=1}}return{value:t,done:y}}}(e,o,i),!0),f}var a={};function u(){}function c(){}function f(){}t=Object.getPrototypeOf;var l=[][n]?t(t([][n]())):(b(t={},n,function(){return this}),t),y=f.prototype=u.prototype=Object.create(l);function s(r){return Object.setPrototypeOf?Object.setPrototypeOf(r,f):(r.__proto__=f,b(r,o,"GeneratorFunction")),r.prototype=Object.create(y),r}return c.prototype=f,b(y,"constructor",f),b(f,"constructor",c),c.displayName="GeneratorFunction",b(f,o,"GeneratorFunction"),b(y),b(y,o,"Generator"),b(y,n,function(){return this}),b(y,"toString",function(){return"[object Generator]"}),(p=function(){return{w:i,m:s}})()}function b(r,t,e,n){var o=Object.defineProperty;try{o({},"",{})}catch(r){o=0}b=function(r,t,e,n){function i(t,e){b(r,t,function(r){return this._invoke(t,e,r)})}t?o?o(r,t,{value:e,enumerable:!n,configurable:!n,writable:!n}):r[t]=e:(i("next",0),i("throw",1),i("return",2))},b(r,t,e,n)}function v(r){if(null!=r){var t=r["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],e=0;if(t)return t.call(r);if("function"==typeof r.next)return r;if(!isNaN(r.length))return{next:function(){return r&&e>=r.length&&(r=void 0),{value:r&&r[e++],done:!r}}}}throw new TypeError(typeof r+" is not iterable")}function m(r,e){return t(r)||c(r,e)||j(r,e)||f()}function d(r){return e(r)||u(r)||j(r)||l()}function h(r,t){if("object"!=typeof r||!r)return r;var e=r[Symbol.toPrimitive];if(void 0!==e){var n=e.call(r,t);if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(r)}function g(r){var t=h(r,"string");return"symbol"==typeof t?t:t+""}function O(r){"@babel/helpers - typeof";return O="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},O(r)}function j(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}export{r as arrayLikeToArray,t as arrayWithHoles,e as arrayWithoutHoles,o as asyncToGenerator,i as createForOfIteratorHelper,a as defineProperty,u as iterableToArray,c as iterableToArrayLimit,f as nonIterableRest,l as nonIterableSpread,s as objectSpread2,p as regenerator,b as regeneratorDefine,v as regeneratorValues,m as slicedToArray,d as toConsumableArray,h as toPrimitive,g as toPropertyKey,O as typeof,j as unsupportedIterableToArray};
4
4
  //# sourceMappingURL=_rollupPluginBabelHelpers.js.map
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("../_virtual/_rollupPluginBabelHelpers.cjs"),n=require("node:child_process"),r=require("node:fs/promises"),t=require("node:os"),i=require("node:path"),s=require("node:timers/promises"),a=require("zod"),o=require("../helpers/cleanWorkingDirectory.cjs"),c=require("../helpers/copyTestCaseFileInput.cjs"),u=require("../helpers/findEntryPointFile.cjs"),d=require("../helpers/findLanguageDefinitionByPath.cjs"),l=require("../helpers/judgeByStaticAnalysis.cjs"),p=require("../helpers/parseArgs.cjs"),f=require("../helpers/printTestCaseResult.cjs"),m=require("../helpers/readOutputFiles.cjs"),h=require("../helpers/readProblemMarkdownFrontMatter.cjs"),g=require("../helpers/readTestCases.cjs"),v=require("../helpers/spawnSyncWithTimeout.cjs"),w=require("../types/decisionCode.cjs"),C=require("../types/language.cjs"),b=["darwin"===t.platform()?"gtime":"/usr/bin/time","--format","%e %M"],y=a.z.object({language:a.z.union([a.z.string(),a.z.array(a.z.string())]).optional()});function k(){return(k=e.asyncToGenerator(e.regenerator().m(function n(r,t){var i,s,a,g,v,C,b,k,R,F,P,_,L,j,x,q,B,N,A,G,W,z,X,Y,H,Q,V,K,J,$,Z,ee,ne,re,te,ie,se,ae,oe,ce,ue,de,le,pe,fe,me,he,ge,ve,we,Ce,be,ye,ke,Ie,Re,Ee,Se,Te,De,Fe,Me,Pe,_e,Le,Oe,je,xe,qe,Be,Ne,Ae;return e.regenerator().w(function(n){for(;;)switch(n.p=n.n){case 0:return b=p.parseArgs(process.argv),k=y.parse(b.params),n.n=1,h.readProblemMarkdownFrontMatter(r);case 1:return R=n.v,n.n=2,(null!=(i=t.readTestCases)?i:D)(r);case 2:return F=n.v,P=F.length>0?F:[{id:"default"}],_=null!=(s=null==(a=P[0])?void 0:a.id)?s:"prebuild",n.n=3,l.judgeByStaticAnalysis(b.cwd,R);case 3:if(!(L=n.v)){n.n=4;break}return f.printTestCaseResult(e.objectSpread2({testCaseId:_},L)),n.a(2);case 4:if(null==(g=t.mainFilePath)){n.n=5;break}Fe=g,n.n=7;break;case 5:return n.n=6,u.findEntryPointFile(b.cwd,k.language);case 6:Fe=n.v;case 7:if(j=Fe){n.n=8;break}return f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:t.mainFilePath?"required main file not found: ".concat(t.mainFilePath):"main file not found".concat(k.language?": language: ".concat(k.language):"")}),n.a(2);case 8:if(x=d.findLanguageDefinitionByPath(j)){n.n=9;break}return f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.WRONG_ANSWER,stderr:"unsupported language"}),n.a(2);case 9:return q=e.objectSpread2(e.objectSpread2({},process.env),{},{CI:"",FORCE_COLOR:"0"}),n.n=10,I({cwd:b.cwd,language:k.language,configuredMainFilePath:t.mainFilePath});case 10:if(B=n.v,!x.prebuild){n.n=15;break}return n.p=11,n.n=12,x.prebuild(b.cwd);case 12:return n.n=13,I({cwd:b.cwd,language:null!=(N=k.language)?N:E(j),configuredMainFilePath:t.mainFilePath,allowConfiguredPathFallback:!0});case 13:(A=n.v)&&(B=A),n.n=15;break;case 14:return n.p=14,Me=n.v,f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.BUILD_ERROR,stderr:U(Me)}),n.a(2);case 15:if(B){n.n=16;break}return f.printTestCaseResult({testCaseId:_,decisionCode:w.DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:t.mainFilePath?"required main file not found: ".concat(t.mainFilePath):"main file not found".concat(k.language?": language: ".concat(k.language):"")}),n.a(2);case 16:return n.n=17,null==(C=t.prepare)?void 0:C.call(t,{cwd:b.cwd,env:q,mainFilePath:B,problemMarkdownFrontMatter:R});case 17:if(null==(v=n.v)){n.n=18;break}Pe=v,n.n=19;break;case 18:Pe=S({cwd:b.cwd,env:q,mainFilePath:B,languageDefinition:x});case 19:if(!(G=Pe)){n.n=20;break}return f.printTestCaseResult({testCaseId:_,decisionCode:null!=(W=G.decisionCode)?W:w.DecisionCode.BUILD_ERROR,feedbackMarkdown:G.feedbackMarkdown,stderr:G.stderr,stdout:G.stdout,outputFiles:G.outputFiles}),n.a(2);case 20:return n.n=21,o.snapshotWorkingDirectory(b.cwd);case 21:if(z=n.v,Y=_,n.p=22,!t.runCommand){n.n=23;break}_e=void 0,n.n=25;break;case 23:return n.n=24,O();case 24:_e=n.v;case 25:X=_e,V=null==(Q=F.shared)?void 0:Q.fileInputPath,K=e.createForOfIteratorHelper(P),n.p=26,K.s();case 27:if((J=K.n()).done){n.n=53;break}if(ue=J.value,Y=ue.id,!V){n.n=28;break}return n.n=28,c.copyTestCaseFileInput(V,b.cwd);case 28:if(!ue.fileInputPath){n.n=29;break}return n.n=29,c.copyTestCaseFileInput(ue.fileInputPath,b.cwd);case 29:return de="number"==typeof R.timeLimitMs?R.timeLimitMs/1e3:null!=($=t.runTimeoutSeconds)?$:5,le=X?e.objectSpread2(e.objectSpread2({},q),{},{DISPLAY:X.display}):q,n.n=30,null==(ne=t.resolveInput)?void 0:ne.call(t,{testCase:ue,cwd:b.cwd,env:le});case 30:if(null==(ee=n.v)){n.n=31;break}Le=ee,n.n=32;break;case 31:Le=ue.input;case 32:if(null==(Z=Le)){n.n=33;break}Oe=Z,n.n=34;break;case 33:Oe="";case 34:return H=pe=Oe,n.n=35,null==(te=t.command)?void 0:te.call(t,{testCase:ue,cwd:b.cwd,env:le,mainFilePath:B});case 35:if(null==(re=n.v)){n.n=36;break}je=re,n.n=37;break;case 36:je=x.command(B);case 37:if(fe=je,me=void 0,n.p=38,!t.runCommand){n.n=40;break}return n.n=39,t.runCommand({testCase:ue,command:fe,stdin:pe,cwd:b.cwd,env:le,timeLimitSeconds:de,screenshotWaitSeconds:null!=(he=t.screenshotWaitSeconds)?he:.3,stopDetectionThreshold:null!=(ge=t.stopDetectionThreshold)?ge:5});case 39:xe=n.v,n.n=42;break;case 40:return n.n=41,M({command:fe,stdin:pe,cwd:b.cwd,env:le,timeLimitSeconds:de,screenshotWaitSeconds:null!=(ve=t.screenshotWaitSeconds)?ve:.3,stopDetectionThreshold:null!=(we=t.stopDetectionThreshold)?we:5});case 41:xe=n.v;case 42:me=xe,n.n=45;break;case 43:return n.p=43,qe=n.v,f.printTestCaseResult({testCaseId:ue.id,decisionCode:w.DecisionCode.RUNTIME_ERROR,stdin:pe,stderr:U(qe)}),n.n=44,o.cleanWorkingDirectory(b.cwd,z);case 44:return n.a(2);case 45:return n.n=46,m.readOutputFiles(b.cwd,null!=(ie=R.requiredOutputFilePaths)?ie:[]);case 46:if(Ce=n.v,be={timeLimitSeconds:de,problemMarkdownFrontMatter:{memoryLimitByte:R.memoryLimitByte,requiredOutputFilePaths:R.requiredOutputFilePaths}},ye=T({runResult:me,outputFiles:Ce,context:be}),ke=ye,ye.decisionCode!==w.DecisionCode.ACCEPTED){n.n=50;break}return n.p=47,n.n=48,t.test({testCase:ue,runResult:me,outputFiles:Ce,context:be});case 48:Re=n.v,ke={decisionCode:null!=(Ie=Re.decisionCode)?Ie:ye.decisionCode,feedbackMarkdown:Re.feedbackMarkdown,stderr:Re.stderr,stdout:Re.stdout,outputFiles:Re.outputFiles},n.n=50;break;case 49:n.p=49,Be=n.v,ke={decisionCode:w.DecisionCode.RUNTIME_ERROR,stderr:U(Be)};case 50:return Ee=null!=(se=ke.decisionCode)?se:w.DecisionCode.ACCEPTED,Se=null!=(ae=ke.stdout)?ae:me.stdout,Te=null!=(oe=ke.stderr)?oe:me.stderr,f.printTestCaseResult({testCaseId:ue.id,decisionCode:Ee,exitStatus:me.status,stdin:me.stdin||void 0,stdout:Se||void 0,stderr:Te||void 0,timeSeconds:me.timeSeconds,memoryBytes:me.memoryBytes,feedbackMarkdown:ke.feedbackMarkdown,outputFiles:null!=(ce=ke.outputFiles)?ce:Ce.length>0?Ce:void 0}),n.n=51,o.cleanWorkingDirectory(b.cwd,z);case 51:if(Ee===w.DecisionCode.ACCEPTED){n.n=52;break}return n.a(3,53);case 52:n.n=27;break;case 53:n.n=55;break;case 54:n.p=54,Ne=n.v,K.e(Ne);case 55:return n.p=55,K.f(),n.f(55);case 56:n.n=58;break;case 57:return n.p=57,Ae=n.v,f.printTestCaseResult({testCaseId:Y,decisionCode:w.DecisionCode.RUNTIME_ERROR,stdin:H,stderr:U(Ae)}),n.n=58,o.cleanWorkingDirectory(b.cwd,z);case 58:return n.p=58,n.n=59,null==(De=X)?void 0:De.dispose();case 59:return n.f(58);case 60:return n.a(2)}},n,null,[[47,49],[38,43],[26,54,55,56],[22,57,58,60],[11,14]])}))).apply(this,arguments)}function I(e){return R.apply(this,arguments)}function R(){return(R=e.asyncToGenerator(e.regenerator().m(function n(r){var t;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:if(!r.configuredMainFilePath){e.n=3;break}return t=i.join(r.cwd,r.configuredMainFilePath),e.n=1,A(t);case 1:if(!e.v){e.n=2;break}return e.a(2,r.configuredMainFilePath);case 2:if(r.allowConfiguredPathFallback){e.n=3;break}return e.a(2,void 0);case 3:return e.n=4,u.findEntryPointFile(r.cwd,r.language);case 4:return e.a(2,e.v)}},n)}))).apply(this,arguments)}function E(n){var r=Object.entries(C.languageIdToDefinition).filter(function(r){return e.slicedToArray(r,2)[1].fileExtensions.some(function(e){return n.endsWith(e)})}).map(function(n){return e.slicedToArray(n,1)[0]});return r.length>0?r:void 0}function S(e){var n,r,t=null==(n=(r=e.languageDefinition).buildCommand)?void 0:n.call(r,e.mainFilePath);if(t){var i=v.spawnSyncWithTimeout(t[0],t.slice(1),{cwd:e.cwd,encoding:"utf8",env:e.env},10);return i.timeSeconds>10?{decisionCode:w.DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,stderr:i.stderr||void 0}:0!==i.status?{decisionCode:w.DecisionCode.BUILD_ERROR,stderr:i.stderr||i.stdout||void 0}:void 0}}function T(e){var n,r,t;if("timeout"===e.runResult.stopReason)return{decisionCode:w.DecisionCode.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(0!==e.runResult.status)return{decisionCode:w.DecisionCode.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(n=e.context.problemMarkdownFrontMatter.memoryLimitByte)?n:Number.POSITIVE_INFINITY))return{decisionCode:w.DecisionCode.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var i=null!=(r=null==(t=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:t.length)?r:0;return e.outputFiles.length<i?{decisionCode:w.DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:w.DecisionCode.ACCEPTED}}function D(e){return F.apply(this,arguments)}function F(){return(F=e.asyncToGenerator(e.regenerator().m(function n(r){return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,g.readTestCases(i.join(r,"test_cases"));case 1:return e.a(2,e.v)}},n)}))).apply(this,arguments)}function M(e){return P.apply(this,arguments)}function P(){return(P=e.asyncToGenerator(e.regenerator().m(function r(t){var i,a,o,c,u,d,l,p,f,m,h,g,v,w,C,y;return e.regenerator().w(function(r){for(;;)switch(r.n){case 0:i=["timeout",t.timeLimitSeconds.toFixed(3)].concat(b,e.toConsumableArray(t.command)),(a=n.spawn(i[0],i.slice(1),{cwd:t.cwd,env:t.env,detached:"win32"!==process.platform,stdio:["pipe","pipe","pipe"]})).stdout.setEncoding("utf8"),a.stderr.setEncoding("utf8"),o="",c="",l="process_exit",p=[],f=[],m=Date.now()/1e3,h=0,a.stdout.on("data",function(e){o+=e}),a.stderr.on("data",function(e){c+=e}),a.on("error",function(e){d=e,u=1}),a.on("close",function(e,n){return 124===e?(l="timeout",void(u=0)):n?(u=1,void(c=c?"".concat(c,"\nprocess terminated by signal: ").concat(n):"process terminated by signal: ".concat(n))):void(u=null!=e?e:1)}),t.stdin&&a.stdin.write(t.stdin),a.stdin.end(),g=e.regenerator().m(function n(){var r,i;return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,s.setTimeout(1e3*t.screenshotWaitSeconds);case 1:if(h=Math.max(h,B(a.pid)),r=_(t.env.DISPLAY),!((f=r.toSorted(function(e,n){return e.data.length-n.data.length})).length>0)){e.n=2;break}if(i=f.map(function(e){return e.data}).toSorted(),p.unshift(i),p.length=Math.min(p.length,t.stopDetectionThreshold),p.length!==t.stopDetectionThreshold||!p.every(function(e){return e.length===i.length&&e.every(function(e,n){return e===i[n]})})){e.n=2;break}return l="stable_screenshot",u=0,e.a(2,0);case 2:if(!(Date.now()/1e3-m>t.timeLimitSeconds)){e.n=3;break}return l="timeout",u=0,e.a(2,0);case 3:return e.a(2)}},n)});case 1:if(void 0!==u){r.n=4;break}return r.d(e.regeneratorValues(g()),2);case 2:if(0!==r.v){r.n=3;break}return r.a(3,4);case 3:r.n=1;break;case 4:return"process_exit"!==l&&null===a.exitCode&&(a.removeAllListeners("close"),a.removeAllListeners("error")),r.n=5,x(a);case 5:if(!d){r.n=6;break}throw d;case 6:return v=L(c,m,h),w=v.memoryBytes,C=v.stderr,y=v.timeSeconds,r.a(2,{stdin:t.stdin,stdout:o.trimEnd(),stderr:C,status:u,timeSeconds:y,memoryBytes:w,screenshots:f,stopReason:l})}},r)}))).apply(this,arguments)}function _(r){var t=r?e.objectSpread2(e.objectSpread2({},process.env),{},{DISPLAY:r}):process.env,i=n.spawnSync("xwininfo",["-root","-tree"],{encoding:"utf8",env:t});if(i.error)throw i.error;if(0!==i.status||!i.stdout)return[];for(var s=[],a=0,o=function(n){var r,t=[],i=n.split("\n"),s=e.createForOfIteratorHelper(i);try{for(s.s();!(r=s.n()).done;){var a=r.value;if(!(a.includes("Root window id:")||a.includes("Parent window id:")||a.includes("()"))){var o=/^\s{5}(0x[\da-f]+) /.exec(a);null!=o&&o[1]&&t.push(Number.parseInt(o[1],16).toString())}}}catch(e){s.e(e)}finally{s.f()}return t}(i.stdout);a<o.length;a++){var c=o[a],u=n.spawnSync("maim",["-i",c],{env:t});if(u.error)throw u.error;if(0===u.status&&0!==u.stdout.length){var d=n.spawnSync("xdotool",["getwindowname",c],{encoding:"utf8",env:t});if(d.error)throw d.error;var l=d.stdout.trim().replaceAll(/[\s/]/g,"_");s.push({path:"".concat(l||"window","_").concat(c,".png"),data:u.stdout.toString("base64"),encoding:"base64"})}}return s}function L(e,n,r){var t=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=t?e.slice(0,t.index).trimEnd():e.trimEnd(),s=1024*Number(null==t?void 0:t[2])||0;return{stderr:i,timeSeconds:Number(null==t?void 0:t[1])||Date.now()/1e3-n,memoryBytes:Math.max(s,r)}}function O(){return j.apply(this,arguments)}function j(){return j=e.asyncToGenerator(e.regenerator().m(function r(){var t,i,a;return e.regenerator().w(function(r){for(;;)switch(r.n){case 0:if("linux"===process.platform){r.n=1;break}throw new Error("GUI screenshot capture is supported only on Linux.");case 1:t=e.regenerator().m(function r(){var t,i,o;return e.regenerator().w(function(r){for(;;)switch(r.n){case 0:return t=":".concat(a),(o=n.spawn("Xvfb",[t,"-screen","0","1280x1024x24","-ac"],{stdio:"ignore"})).on("error",function(e){i=e}),r.n=1,s.setTimeout(300);case 1:if(!i){r.n=2;break}throw i;case 2:if(null===o.exitCode){r.n=3;break}return r.a(2,0);case 3:return r.a(2,{v:{display:t,dispose:function(){var n=e.asyncToGenerator(e.regenerator().m(function n(){return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:if(o.killed){e.n=2;break}return o.kill("SIGTERM"),e.n=1,s.setTimeout(100);case 1:null===o.exitCode&&o.kill("SIGKILL");case 2:return e.a(2)}},n)}));return function(){return n.apply(this,arguments)}}()}})}},r)}),a=90;case 2:if(!(a<100)){r.n=6;break}return r.d(e.regeneratorValues(t()),3);case 3:if(0!==(i=r.v)){r.n=4;break}return r.a(3,5);case 4:if(!i){r.n=5;break}return r.a(2,i.v);case 5:a++,r.n=2;break;case 6:throw new Error("Xvfb could not be started.");case 7:return r.a(2)}},r)})),j.apply(this,arguments)}function x(e){return q.apply(this,arguments)}function q(){return(q=e.asyncToGenerator(e.regenerator().m(function n(r){return e.regenerator().w(function(e){for(;;)switch(e.n){case 0:if(r.pid){e.n=1;break}return e.a(2);case 1:return N(r.pid,"SIGTERM"),e.n=2,s.setTimeout(200);case 2:null===r.exitCode&&N(r.pid,"SIGKILL");case 3:return e.a(2)}},n)}))).apply(this,arguments)}function B(e){if(!e||"linux"!==process.platform)return 0;var r=n.spawnSync("ps",["-o","rss=","--no-headers","--pgroup",String(e)],{encoding:"utf8"});return r.error||0!==r.status||!r.stdout?0:r.stdout.split("\n").map(function(e){return Number(e.trim())}).filter(function(e){return Number.isFinite(e)&&e>0}).reduce(function(e,n){return e+1024*n},0)}function N(e,n){try{if("win32"!==process.platform)return void process.kill(-e,n)}catch(e){}try{process.kill(e,n)}catch(e){}}function A(e){return G.apply(this,arguments)}function G(){return(G=e.asyncToGenerator(e.regenerator().m(function n(t){return e.regenerator().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,r.access(t);case 1:return e.a(2,!0);case 2:return e.p=2,e.v,e.a(2,!1)}},n,null,[[0,2]])}))).apply(this,arguments)}function U(e){return e instanceof Error?e.message:String(e)}exports.guiCommandJudgePreset=function(e,n){return k.apply(this,arguments)};
2
+ //# sourceMappingURL=guiCommand.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guiCommand.cjs","sources":["../../src/presets/guiCommand.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 5;\nconst SCREENSHOT_WAIT_SECONDS = 0.3;\nconst XVFB_STARTUP_WAIT_SECONDS = 0.3;\nconst XVFB_SHUTDOWN_WAIT_SECONDS = 0.1;\nconst PROCESS_SHUTDOWN_WAIT_SECONDS = 0.2;\nconst STOP_DETECTION_THRESHOLD = 5;\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseGuiTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\nexport interface GuiScreenshotFile {\n path: string;\n data: string;\n encoding: 'base64';\n}\n\nexport interface GuiCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n screenshots: GuiScreenshotFile[];\n stopReason: 'process_exit' | 'stable_screenshot' | 'timeout';\n}\n\ninterface GuiJudgeContext {\n timeLimitSeconds: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\ntype GuiJudgeCaseResult = Pick<\n TestCaseResult,\n 'decisionCode' | 'feedbackMarkdown' | 'stderr' | 'stdout' | 'outputFiles'\n>;\n\nexport interface GuiCommandJudgePresetOptions<TTestCase extends BaseGuiTestCase = BaseGuiTestCase> {\n mainFilePath?: string;\n runTimeoutSeconds?: number;\n screenshotWaitSeconds?: number;\n stopDetectionThreshold?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n prepare?: (context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n problemMarkdownFrontMatter: ProblemMarkdownFrontMatter;\n }) => Promise<Partial<GuiJudgeCaseResult> | undefined> | Partial<GuiJudgeCaseResult> | undefined;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n command?: (context: {\n testCase: TTestCase;\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n }) => Promise<readonly [string, ...string[]]> | readonly [string, ...string[]];\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n }) => Promise<GuiCommandRunResult> | GuiCommandRunResult;\n test: (context: {\n testCase: TTestCase;\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n }) => Promise<Partial<GuiJudgeCaseResult>> | Partial<GuiJudgeCaseResult>;\n}\n\n/**\n * A preset function for judging GUI programs by collecting screenshots while the program runs.\n *\n * Keep problem-specific logic in `prepare`, `command`, and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { DecisionCode } from '@exercode/problem-utils';\n * import { guiCommandJudgePreset } from '@exercode/problem-utils/presets/guiCommand';\n *\n * await guiCommandJudgePreset(import.meta.dirname, {\n * mainFilePath: 'Main.java',\n * readTestCases: async () => [{ id: 'default' }],\n * test: ({ runResult }) => {\n * return runResult.screenshots.length > 0\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n */\nexport async function guiCommandJudgePreset<TTestCase extends BaseGuiTestCase = BaseGuiTestCase>(\n problemDir: string,\n options: GuiCommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const configuredTestCases = await (options.readTestCases ?? readGuiTestCases<TTestCase>)(problemDir);\n const testCases =\n configuredTestCases.length > 0 ? configuredTestCases : ([{ id: 'default' }] as unknown as readonly TTestCase[]);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const initialMainFilePath = options.mainFilePath ?? (await findEntryPointFile(args.cwd, params.language));\n if (!initialMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(initialMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let resolvedMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language,\n configuredMainFilePath: options.mainFilePath,\n });\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language ?? inferLanguageIdsByPath(initialMainFilePath),\n configuredMainFilePath: options.mainFilePath,\n allowConfiguredPathFallback: true,\n });\n if (prebuiltMainFilePath) resolvedMainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: errorToMessage(error),\n });\n return;\n }\n }\n if (!resolvedMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const prepareResult =\n (await options.prepare?.({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n problemMarkdownFrontMatter,\n })) ??\n runDefaultPrepare({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n languageDefinition,\n });\n if (prepareResult) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: prepareResult.decisionCode ?? DecisionCode.BUILD_ERROR,\n feedbackMarkdown: prepareResult.feedbackMarkdown,\n stderr: prepareResult.stderr,\n stdout: prepareResult.stdout,\n outputFiles: prepareResult.outputFiles,\n });\n return;\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n let displayServer: Awaited<ReturnType<typeof ensureDisplayServer>> | undefined;\n let currentTestCaseId = prebuildTestCaseId;\n let currentStdin: string | undefined;\n try {\n displayServer = options.runCommand ? undefined : await ensureDisplayServer();\n const sharedFileInputPath = (configuredTestCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n for (const testCase of testCases) {\n currentTestCaseId = testCase.id;\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : (options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS);\n\n const runEnv = displayServer ? { ...env, DISPLAY: displayServer.display } : env;\n const stdin = (await options.resolveInput?.({ testCase, cwd: args.cwd, env: runEnv })) ?? testCase.input ?? '';\n currentStdin = stdin;\n const command =\n (await options.command?.({ testCase, cwd: args.cwd, env: runEnv, mainFilePath: resolvedMainFilePath })) ??\n languageDefinition.command(resolvedMainFilePath);\n\n let runResult: GuiCommandRunResult;\n try {\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n })\n : await spawnGuiProgram({\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: GuiJudgeContext = {\n timeLimitSeconds,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateGuiRunResult({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test({\n testCase,\n runResult,\n outputFiles,\n context: judgeContext,\n });\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n stdout: extendedJudgeResult.stdout,\n outputFiles: extendedJudgeResult.outputFiles,\n };\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n const decisionCode = judgeResult.decisionCode ?? DecisionCode.ACCEPTED;\n const stdout = judgeResult.stdout ?? runResult.stdout;\n const stderr = judgeResult.stderr ?? runResult.stderr;\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: runResult.status,\n stdin: runResult.stdin || undefined,\n stdout: stdout || undefined,\n stderr: stderr || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n feedbackMarkdown: judgeResult.feedbackMarkdown,\n outputFiles: judgeResult.outputFiles ?? (outputFiles.length > 0 ? outputFiles : undefined),\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n } catch (error) {\n printTestCaseResult({\n testCaseId: currentTestCaseId,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: currentStdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n } finally {\n await displayServer?.dispose();\n }\n}\n\nasync function resolveMainFilePath(context: {\n cwd: string;\n language?: string | string[];\n configuredMainFilePath?: string;\n allowConfiguredPathFallback?: boolean;\n}): Promise<string | undefined> {\n if (context.configuredMainFilePath) {\n const resolvedPath = path.join(context.cwd, context.configuredMainFilePath);\n if (await pathExists(resolvedPath)) return context.configuredMainFilePath;\n if (!context.allowConfiguredPathFallback) return undefined;\n }\n\n return await findEntryPointFile(context.cwd, context.language);\n}\n\nfunction inferLanguageIdsByPath(filePath: string): string[] | undefined {\n const languageIds = Object.entries(languageIdToDefinition)\n .filter(([, definition]) => definition.fileExtensions.some((ext) => filePath.endsWith(ext)))\n .map(([languageId]) => languageId);\n return languageIds.length > 0 ? languageIds : undefined;\n}\n\nfunction runDefaultPrepare(context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n languageDefinition: NonNullable<ReturnType<typeof findLanguageDefinitionByPath>>;\n}): Partial<GuiJudgeCaseResult> | undefined {\n const buildCommand = context.languageDefinition.buildCommand?.(context.mainFilePath);\n if (!buildCommand) return undefined;\n\n const buildResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n BUILD_TIMEOUT_SECONDS\n );\n\n if (buildResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: buildResult.stderr || undefined,\n };\n }\n\n if (buildResult.status !== 0) {\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: buildResult.stderr || buildResult.stdout || undefined,\n };\n }\n\n return undefined;\n}\n\nfunction evaluateGuiRunResult(context: {\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n}): Partial<GuiJudgeCaseResult> {\n if (context.runResult.stopReason === 'timeout') {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n if (context.runResult.status !== 0) {\n return {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: context.runResult.stderr,\n };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return {\n decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n const requiredOutputFilesCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFilesCount) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR,\n };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n\nasync function readGuiTestCases<TTestCase extends BaseGuiTestCase>(problemDir: string): Promise<readonly TTestCase[]> {\n return (await readFileTestCases(path.join(problemDir, 'test_cases'))) as unknown as readonly TTestCase[];\n}\n\nasync function spawnGuiProgram(context: {\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n}): Promise<GuiCommandRunResult> {\n const wrappedCommand = ['timeout', context.timeLimitSeconds.toFixed(3), ...TIME_COMMAND, ...context.command] as const;\n const child = childProcess.spawn(wrappedCommand[0], wrappedCommand.slice(1), {\n cwd: context.cwd,\n env: context.env,\n detached: process.platform !== 'win32',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n let spawnError: Error | undefined;\n let stopReason: GuiCommandRunResult['stopReason'] = 'process_exit';\n const screenshotSignaturesHistory: string[][] = [];\n let screenshots: GuiScreenshotFile[] = [];\n const startTimeSeconds = Date.now() / 1000;\n let sampledMemoryBytes = 0;\n\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', (error) => {\n spawnError = error;\n exitCode = 1;\n });\n child.on('close', (code, signal) => {\n if (code === 124) {\n stopReason = 'timeout';\n exitCode = 0;\n return;\n }\n if (signal) {\n exitCode = 1;\n stderr = stderr\n ? `${stderr}\\nprocess terminated by signal: ${signal}`\n : `process terminated by signal: ${signal}`;\n return;\n }\n exitCode = code ?? 1;\n });\n\n if (context.stdin) child.stdin.write(context.stdin);\n child.stdin.end();\n\n while (exitCode === undefined) {\n await wait(context.screenshotWaitSeconds * 1000);\n sampledMemoryBytes = Math.max(sampledMemoryBytes, readProcessGroupMemoryBytes(child.pid));\n const currentScreenshots = takeScreenshots(context.env.DISPLAY);\n screenshots = currentScreenshots.toSorted((a, b) => a.data.length - b.data.length);\n\n if (screenshots.length > 0) {\n const screenshotSignatures = screenshots.map((file) => file.data).toSorted();\n screenshotSignaturesHistory.unshift(screenshotSignatures);\n screenshotSignaturesHistory.length = Math.min(screenshotSignaturesHistory.length, context.stopDetectionThreshold);\n if (\n screenshotSignaturesHistory.length === context.stopDetectionThreshold &&\n screenshotSignaturesHistory.every(\n (files) =>\n files.length === screenshotSignatures.length &&\n files.every((file, index) => file === screenshotSignatures[index])\n )\n ) {\n stopReason = 'stable_screenshot';\n exitCode = 0;\n break;\n }\n }\n\n if (Date.now() / 1000 - startTimeSeconds > context.timeLimitSeconds) {\n stopReason = 'timeout';\n exitCode = 0;\n break;\n }\n }\n\n if (stopReason !== 'process_exit' && child.exitCode === null) {\n child.removeAllListeners('close');\n child.removeAllListeners('error');\n }\n await stopProcess(child);\n if (spawnError) throw spawnError;\n const {\n memoryBytes,\n stderr: normalizedStderr,\n timeSeconds,\n } = parseTimedStderr(stderr, startTimeSeconds, sampledMemoryBytes);\n\n return {\n stdin: context.stdin,\n stdout: stdout.trimEnd(),\n stderr: normalizedStderr,\n status: exitCode,\n timeSeconds,\n memoryBytes,\n screenshots,\n stopReason,\n };\n}\n\nfunction takeScreenshots(display: string | undefined): GuiScreenshotFile[] {\n const env = display ? { ...process.env, DISPLAY: display } : process.env;\n const xwininfo = childProcess.spawnSync('xwininfo', ['-root', '-tree'], { encoding: 'utf8', env });\n if (xwininfo.error) throw xwininfo.error;\n if (xwininfo.status !== 0 || !xwininfo.stdout) return [];\n\n const screenshots: GuiScreenshotFile[] = [];\n for (const windowId of extractTopLevelWindowIds(xwininfo.stdout)) {\n const screenshot = childProcess.spawnSync('maim', ['-i', windowId], { env });\n if (screenshot.error) throw screenshot.error;\n if (screenshot.status !== 0 || screenshot.stdout.length === 0) continue;\n\n const windowNameResult = childProcess.spawnSync('xdotool', ['getwindowname', windowId], { encoding: 'utf8', env });\n if (windowNameResult.error) throw windowNameResult.error;\n const windowName = windowNameResult.stdout.trim().replaceAll(/[\\s/]/g, '_');\n\n screenshots.push({\n path: `${windowName || 'window'}_${windowId}.png`,\n data: screenshot.stdout.toString('base64'),\n encoding: 'base64',\n });\n }\n\n return screenshots;\n}\n\nfunction extractTopLevelWindowIds(stdout: string): string[] {\n const windowIds: string[] = [];\n const lines = stdout.split('\\n');\n for (const line of lines) {\n if (line.includes('Root window id:') || line.includes('Parent window id:') || line.includes('()')) continue;\n\n const match = /^\\s{5}(0x[\\da-f]+) /.exec(line);\n if (!match?.[1]) continue;\n windowIds.push(Number.parseInt(match[1], 16).toString());\n }\n return windowIds;\n}\n\nfunction parseTimedStderr(\n stderr: string,\n startTimeSeconds: number,\n sampledMemoryBytes: number\n): Pick<GuiCommandRunResult, 'stderr' | 'timeSeconds' | 'memoryBytes'> {\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(stderr);\n const normalizedStderr = match ? stderr.slice(0, match.index).trimEnd() : stderr.trimEnd();\n const parsedMemoryBytes = Number(match?.[2]) * 1024 || 0;\n return {\n stderr: normalizedStderr,\n timeSeconds: Number(match?.[1]) || Date.now() / 1000 - startTimeSeconds,\n memoryBytes: Math.max(parsedMemoryBytes, sampledMemoryBytes),\n };\n}\n\nasync function ensureDisplayServer(): Promise<{ display: string; dispose: () => Promise<void> }> {\n if (process.platform !== 'linux') {\n throw new Error('GUI screenshot capture is supported only on Linux.');\n }\n\n for (let displayNumber = 90; displayNumber < 100; displayNumber++) {\n const display = `:${displayNumber}`;\n let spawnError: Error | undefined;\n const xvfb = childProcess.spawn('Xvfb', [display, '-screen', '0', '1280x1024x24', '-ac'], {\n stdio: 'ignore',\n });\n xvfb.on('error', (error) => {\n spawnError = error;\n });\n\n await wait(XVFB_STARTUP_WAIT_SECONDS * 1000);\n if (spawnError) throw spawnError;\n if (xvfb.exitCode !== null) continue;\n\n return {\n display,\n dispose: async () => {\n if (!xvfb.killed) {\n xvfb.kill('SIGTERM');\n await wait(XVFB_SHUTDOWN_WAIT_SECONDS * 1000);\n if (xvfb.exitCode === null) xvfb.kill('SIGKILL');\n }\n },\n };\n }\n\n throw new Error('Xvfb could not be started.');\n}\n\nasync function stopProcess(child: childProcess.ChildProcess): Promise<void> {\n if (!child.pid) return;\n killProcessGroup(child.pid, 'SIGTERM');\n await wait(PROCESS_SHUTDOWN_WAIT_SECONDS * 1000);\n if (child.exitCode === null) killProcessGroup(child.pid, 'SIGKILL');\n}\n\nfunction readProcessGroupMemoryBytes(processGroupId: number | undefined): number {\n if (!processGroupId || process.platform !== 'linux') return 0;\n\n const result = childProcess.spawnSync('ps', ['-o', 'rss=', '--no-headers', '--pgroup', String(processGroupId)], {\n encoding: 'utf8',\n });\n if (result.error || result.status !== 0 || !result.stdout) return 0;\n\n return result.stdout\n .split('\\n')\n .map((line) => Number(line.trim()))\n .filter((value) => Number.isFinite(value) && value > 0)\n .reduce((sum, value) => sum + value * 1024, 0);\n}\n\nfunction killProcessGroup(processGroupId: number, signal: NodeJS.Signals): void {\n try {\n if (process.platform !== 'win32') {\n process.kill(-processGroupId, signal);\n return;\n }\n } catch {\n // The process group may already be gone. Fall back to the direct PID below.\n }\n\n try {\n process.kill(processGroupId, signal);\n } catch {\n // The direct child may also already be gone.\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"names":["TIME_COMMAND","os","platform","judgeParamsSchema","z","object","language","union","string","array","optional","_guiCommandJudgePreset","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","_options$readTestCase","_testCases$0$id","_testCases$","_options$mainFilePath","_yield$options$prepar","_options$prepare","args","params","problemMarkdownFrontMatter","configuredTestCases","testCases","prebuildTestCaseId","staticAnalysisResult","initialMainFilePath","languageDefinition","env","resolvedMainFilePath","_params$language","prebuiltMainFilePath","prepareResult","_prepareResult$decisi","cwdSnapshot","displayServer","currentTestCaseId","currentStdin","_shared","sharedFileInputPath","_iterator2","_step2","_options$runTimeoutSe","_ref5","_yield$options$resolv","_options$resolveInput","_yield$options$comman","_options$command","_problemMarkdownFront","_judgeResult$decision","_judgeResult$stdout","_judgeResult$stderr","_judgeResult$outputFi","testCase","timeLimitSeconds","runEnv","stdin","command","runResult","_options$screenshotWa","_options$stopDetectio","_options$screenshotWa2","_options$stopDetectio2","outputFiles","judgeContext","baseJudgeResult","judgeResult","_extendedJudgeResult$","extendedJudgeResult","decisionCode","stdout","stderr","_displayServer","_t","_t2","_t4","_t5","_t7","_t9","_t1","_t10","_t11","_t12","_t13","_t14","w","_context","p","n","parseArgs","process","argv","parse","readProblemMarkdownFrontMatter","v","readTestCases","readGuiTestCases","length","id","judgeByStaticAnalysis","cwd","printTestCaseResult","_objectSpread","testCaseId","a","mainFilePath","findEntryPointFile","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","resolveMainFilePath","configuredMainFilePath","prebuild","inferLanguageIdsByPath","allowConfiguredPathFallback","BUILD_ERROR","errorToMessage","prepare","call","runDefaultPrepare","feedbackMarkdown","snapshotWorkingDirectory","runCommand","undefined","ensureDisplayServer","shared","fileInputPath","_createForOfIteratorHelper","s","done","value","copyTestCaseFileInput","timeLimitMs","runTimeoutSeconds","DISPLAY","display","resolveInput","input","screenshotWaitSeconds","stopDetectionThreshold","spawnGuiProgram","RUNTIME_ERROR","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","memoryLimitByte","evaluateGuiRunResult","context","ACCEPTED","test","exitStatus","status","timeSeconds","memoryBytes","e","f","dispose","apply","this","arguments","_x3","_resolveMainFilePath","_callee2","resolvedPath","_context2","path","join","pathExists","filePath","languageIds","Object","entries","languageIdToDefinition","filter","_ref","_slicedToArray","fileExtensions","some","ext","endsWith","map","_ref3","_context$languageDefi","_context$languageDefi2","buildCommand","buildResult","spawnSyncWithTimeout","slice","encoding","BUILD_TIME_LIMIT_EXCEEDED","_context$context$prob","_context$context$prob2","_context$context$prob3","stopReason","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","requiredOutputFilesCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x4","_readGuiTestCases","_callee3","_context3","readFileTestCases","_x5","_spawnGuiProgram","_callee4","wrappedCommand","child","exitCode","spawnError","screenshotSignaturesHistory","screenshots","startTimeSeconds","sampledMemoryBytes","_loop","_parseTimedStderr","normalizedStderr","_context5","toFixed","_toConsumableArray","childProcess","spawn","detached","stdio","setEncoding","Date","now","on","chunk","error","code","signal","write","end","currentScreenshots","screenshotSignatures","_context4","wait","Math","max","readProcessGroupMemoryBytes","pid","takeScreenshots","toSorted","b","data","file","unshift","min","every","files","index","d","_regeneratorValues","removeAllListeners","stopProcess","parseTimedStderr","trimEnd","xwininfo","spawnSync","_i","_extractTopLevelWindo","_step","windowIds","lines","split","_iterator","line","includes","match","exec","push","parseInt","toString","err","extractTopLevelWindowIds","windowId","screenshot","windowNameResult","windowName","trim","replaceAll","parsedMemoryBytes","_ensureDisplayServer","_callee6","_loop2","_ret2","displayNumber","_context8","Error","xvfb","_context7","XVFB_STARTUP_WAIT_SECONDS","_dispose","_callee5","_context6","killed","kill","XVFB_SHUTDOWN_WAIT_SECONDS","_x6","_stopProcess","_callee7","_context9","killProcessGroup","PROCESS_SHUTDOWN_WAIT_SECONDS","processGroupId","result","String","isFinite","reduce","sum","_unused","_unused2","_x7","_pathExists","_callee8","_context0","fs","access","message","_x","_x2"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import type { ProblemMarkdownFrontMatter } from '../types/problem.js';
2
+ import type { TestCaseResult } from '../types/testCaseResult.js';
3
+ interface BaseGuiTestCase {
4
+ id: string;
5
+ input?: string;
6
+ fileInputPath?: string;
7
+ }
8
+ export interface GuiScreenshotFile {
9
+ path: string;
10
+ data: string;
11
+ encoding: 'base64';
12
+ }
13
+ export interface GuiCommandRunResult {
14
+ stdin: string;
15
+ stdout: string;
16
+ stderr: string;
17
+ status: number | undefined;
18
+ timeSeconds: number;
19
+ memoryBytes: number;
20
+ screenshots: GuiScreenshotFile[];
21
+ stopReason: 'process_exit' | 'stable_screenshot' | 'timeout';
22
+ }
23
+ interface GuiJudgeContext {
24
+ timeLimitSeconds: number;
25
+ problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;
26
+ }
27
+ type GuiJudgeCaseResult = Pick<TestCaseResult, 'decisionCode' | 'feedbackMarkdown' | 'stderr' | 'stdout' | 'outputFiles'>;
28
+ export interface GuiCommandJudgePresetOptions<TTestCase extends BaseGuiTestCase = BaseGuiTestCase> {
29
+ mainFilePath?: string;
30
+ runTimeoutSeconds?: number;
31
+ screenshotWaitSeconds?: number;
32
+ stopDetectionThreshold?: number;
33
+ readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;
34
+ prepare?: (context: {
35
+ cwd: string;
36
+ env: NodeJS.ProcessEnv;
37
+ mainFilePath: string;
38
+ problemMarkdownFrontMatter: ProblemMarkdownFrontMatter;
39
+ }) => Promise<Partial<GuiJudgeCaseResult> | undefined> | Partial<GuiJudgeCaseResult> | undefined;
40
+ resolveInput?: (context: {
41
+ testCase: TTestCase;
42
+ cwd: string;
43
+ env: NodeJS.ProcessEnv;
44
+ }) => Promise<string> | string;
45
+ command?: (context: {
46
+ testCase: TTestCase;
47
+ cwd: string;
48
+ env: NodeJS.ProcessEnv;
49
+ mainFilePath: string;
50
+ }) => Promise<readonly [string, ...string[]]> | readonly [string, ...string[]];
51
+ runCommand?: (context: {
52
+ testCase: TTestCase;
53
+ command: readonly [string, ...string[]];
54
+ stdin: string;
55
+ cwd: string;
56
+ env: NodeJS.ProcessEnv;
57
+ timeLimitSeconds: number;
58
+ screenshotWaitSeconds: number;
59
+ stopDetectionThreshold: number;
60
+ }) => Promise<GuiCommandRunResult> | GuiCommandRunResult;
61
+ test: (context: {
62
+ testCase: TTestCase;
63
+ runResult: GuiCommandRunResult;
64
+ outputFiles: NonNullable<TestCaseResult['outputFiles']>;
65
+ context: GuiJudgeContext;
66
+ }) => Promise<Partial<GuiJudgeCaseResult>> | Partial<GuiJudgeCaseResult>;
67
+ }
68
+ /**
69
+ * A preset function for judging GUI programs by collecting screenshots while the program runs.
70
+ *
71
+ * Keep problem-specific logic in `prepare`, `command`, and `test`.
72
+ *
73
+ * @example
74
+ * Create `judge.ts`:
75
+ * ```ts
76
+ * import { DecisionCode } from '@exercode/problem-utils';
77
+ * import { guiCommandJudgePreset } from '@exercode/problem-utils/presets/guiCommand';
78
+ *
79
+ * await guiCommandJudgePreset(import.meta.dirname, {
80
+ * mainFilePath: 'Main.java',
81
+ * readTestCases: async () => [{ id: 'default' }],
82
+ * test: ({ runResult }) => {
83
+ * return runResult.screenshots.length > 0
84
+ * ? { decisionCode: DecisionCode.ACCEPTED }
85
+ * : { decisionCode: DecisionCode.WRONG_ANSWER };
86
+ * },
87
+ * });
88
+ * ```
89
+ */
90
+ export declare function guiCommandJudgePreset<TTestCase extends BaseGuiTestCase = BaseGuiTestCase>(problemDir: string, options: GuiCommandJudgePresetOptions<TTestCase>): Promise<void>;
91
+ export {};
@@ -0,0 +1,2 @@
1
+ import{asyncToGenerator as e,regenerator as n,createForOfIteratorHelper as t,objectSpread2 as r,slicedToArray as i,regeneratorValues as s,toConsumableArray as a}from"../_virtual/_rollupPluginBabelHelpers.js";import o from"node:child_process";import u from"node:fs/promises";import c from"node:os";import d from"node:path";import{setTimeout as l}from"node:timers/promises";import{z as f}from"zod";import{cleanWorkingDirectory as p,snapshotWorkingDirectory as m}from"../helpers/cleanWorkingDirectory.js";import{copyTestCaseFileInput as h}from"../helpers/copyTestCaseFileInput.js";import{findEntryPointFile as v}from"../helpers/findEntryPointFile.js";import{findLanguageDefinitionByPath as w}from"../helpers/findLanguageDefinitionByPath.js";import{judgeByStaticAnalysis as b}from"../helpers/judgeByStaticAnalysis.js";import{parseArgs as g}from"../helpers/parseArgs.js";import{printTestCaseResult as k}from"../helpers/printTestCaseResult.js";import{readOutputFiles as C}from"../helpers/readOutputFiles.js";import{readProblemMarkdownFrontMatter as I}from"../helpers/readProblemMarkdownFrontMatter.js";import{readTestCases as y}from"../helpers/readTestCases.js";import{spawnSyncWithTimeout as E}from"../helpers/spawnSyncWithTimeout.js";import{DecisionCode as R}from"../types/decisionCode.js";import{languageIdToDefinition as S}from"../types/language.js";var F=["darwin"===c.platform()?"gtime":"/usr/bin/time","--format","%e %M"],M=f.object({language:f.union([f.string(),f.array(f.string())]).optional()});function P(e,n){return _.apply(this,arguments)}function _(){return(_=e(n().m(function e(i,s){var a,o,u,c,d,l,f,y,E,S,F,P,_,T,N,U,A,G,q,X,Y,Q,H,K,V,$,J,Z,ee,ne,te,re,ie,se,ae,oe,ue,ce,de,le,fe,pe,me,he,ve,we,be,ge,ke,Ce,Ie,ye,Ee,Re,Se,Fe,Me,Pe,_e,De,Te,Le,xe,Oe,je,Ne,Be,Ue,Ae,Ge,We,qe;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:return f=g(process.argv),y=M.parse(f.params),e.n=1,I(i);case 1:return E=e.v,e.n=2,(null!=(a=s.readTestCases)?a:j)(i);case 2:return S=e.v,F=S.length>0?S:[{id:"default"}],P=null!=(o=null==(u=F[0])?void 0:u.id)?o:"prebuild",e.n=3,b(f.cwd,E);case 3:if(!(_=e.v)){e.n=4;break}return k(r({testCaseId:P},_)),e.a(2);case 4:if(null==(c=s.mainFilePath)){e.n=5;break}Te=c,e.n=7;break;case 5:return e.n=6,v(f.cwd,y.language);case 6:Te=e.v;case 7:if(T=Te){e.n=8;break}return k({testCaseId:P,decisionCode:R.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:s.mainFilePath?"required main file not found: ".concat(s.mainFilePath):"main file not found".concat(y.language?": language: ".concat(y.language):"")}),e.a(2);case 8:if(N=w(T)){e.n=9;break}return k({testCaseId:P,decisionCode:R.WRONG_ANSWER,stderr:"unsupported language"}),e.a(2);case 9:return U=r(r({},process.env),{},{CI:"",FORCE_COLOR:"0"}),e.n=10,D({cwd:f.cwd,language:y.language,configuredMainFilePath:s.mainFilePath});case 10:if(A=e.v,!N.prebuild){e.n=15;break}return e.p=11,e.n=12,N.prebuild(f.cwd);case 12:return e.n=13,D({cwd:f.cwd,language:null!=(G=y.language)?G:L(T),configuredMainFilePath:s.mainFilePath,allowConfiguredPathFallback:!0});case 13:(q=e.v)&&(A=q),e.n=15;break;case 14:return e.p=14,Le=e.v,k({testCaseId:P,decisionCode:R.BUILD_ERROR,stderr:z(Le)}),e.a(2);case 15:if(A){e.n=16;break}return k({testCaseId:P,decisionCode:R.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,stderr:s.mainFilePath?"required main file not found: ".concat(s.mainFilePath):"main file not found".concat(y.language?": language: ".concat(y.language):"")}),e.a(2);case 16:return e.n=17,null==(l=s.prepare)?void 0:l.call(s,{cwd:f.cwd,env:U,mainFilePath:A,problemMarkdownFrontMatter:E});case 17:if(null==(d=e.v)){e.n=18;break}xe=d,e.n=19;break;case 18:xe=x({cwd:f.cwd,env:U,mainFilePath:A,languageDefinition:N});case 19:if(!(X=xe)){e.n=20;break}return k({testCaseId:P,decisionCode:null!=(Y=X.decisionCode)?Y:R.BUILD_ERROR,feedbackMarkdown:X.feedbackMarkdown,stderr:X.stderr,stdout:X.stdout,outputFiles:X.outputFiles}),e.a(2);case 20:return e.n=21,m(f.cwd);case 21:if(Q=e.v,K=P,e.p=22,!s.runCommand){e.n=23;break}Oe=void 0,e.n=25;break;case 23:return e.n=24,W();case 24:Oe=e.v;case 25:H=Oe,J=null==($=S.shared)?void 0:$.fileInputPath,Z=t(F),e.p=26,Z.s();case 27:if((ee=Z.n()).done){e.n=53;break}if(fe=ee.value,K=fe.id,!J){e.n=28;break}return e.n=28,h(J,f.cwd);case 28:if(!fe.fileInputPath){e.n=29;break}return e.n=29,h(fe.fileInputPath,f.cwd);case 29:return pe="number"==typeof E.timeLimitMs?E.timeLimitMs/1e3:null!=(ne=s.runTimeoutSeconds)?ne:5,me=H?r(r({},U),{},{DISPLAY:H.display}):U,e.n=30,null==(ie=s.resolveInput)?void 0:ie.call(s,{testCase:fe,cwd:f.cwd,env:me});case 30:if(null==(re=e.v)){e.n=31;break}je=re,e.n=32;break;case 31:je=fe.input;case 32:if(null==(te=je)){e.n=33;break}Ne=te,e.n=34;break;case 33:Ne="";case 34:return V=he=Ne,e.n=35,null==(ae=s.command)?void 0:ae.call(s,{testCase:fe,cwd:f.cwd,env:me,mainFilePath:A});case 35:if(null==(se=e.v)){e.n=36;break}Be=se,e.n=37;break;case 36:Be=N.command(A);case 37:if(ve=Be,we=void 0,e.p=38,!s.runCommand){e.n=40;break}return e.n=39,s.runCommand({testCase:fe,command:ve,stdin:he,cwd:f.cwd,env:me,timeLimitSeconds:pe,screenshotWaitSeconds:null!=(be=s.screenshotWaitSeconds)?be:.3,stopDetectionThreshold:null!=(ge=s.stopDetectionThreshold)?ge:5});case 39:Ue=e.v,e.n=42;break;case 40:return e.n=41,B({command:ve,stdin:he,cwd:f.cwd,env:me,timeLimitSeconds:pe,screenshotWaitSeconds:null!=(ke=s.screenshotWaitSeconds)?ke:.3,stopDetectionThreshold:null!=(Ce=s.stopDetectionThreshold)?Ce:5});case 41:Ue=e.v;case 42:we=Ue,e.n=45;break;case 43:return e.p=43,Ae=e.v,k({testCaseId:fe.id,decisionCode:R.RUNTIME_ERROR,stdin:he,stderr:z(Ae)}),e.n=44,p(f.cwd,Q);case 44:return e.a(2);case 45:return e.n=46,C(f.cwd,null!=(oe=E.requiredOutputFilePaths)?oe:[]);case 46:if(Ie=e.v,ye={timeLimitSeconds:pe,problemMarkdownFrontMatter:{memoryLimitByte:E.memoryLimitByte,requiredOutputFilePaths:E.requiredOutputFilePaths}},Ee=O({runResult:we,outputFiles:Ie,context:ye}),Re=Ee,Ee.decisionCode!==R.ACCEPTED){e.n=50;break}return e.p=47,e.n=48,s.test({testCase:fe,runResult:we,outputFiles:Ie,context:ye});case 48:Fe=e.v,Re={decisionCode:null!=(Se=Fe.decisionCode)?Se:Ee.decisionCode,feedbackMarkdown:Fe.feedbackMarkdown,stderr:Fe.stderr,stdout:Fe.stdout,outputFiles:Fe.outputFiles},e.n=50;break;case 49:e.p=49,Ge=e.v,Re={decisionCode:R.RUNTIME_ERROR,stderr:z(Ge)};case 50:return Me=null!=(ue=Re.decisionCode)?ue:R.ACCEPTED,Pe=null!=(ce=Re.stdout)?ce:we.stdout,_e=null!=(de=Re.stderr)?de:we.stderr,k({testCaseId:fe.id,decisionCode:Me,exitStatus:we.status,stdin:we.stdin||void 0,stdout:Pe||void 0,stderr:_e||void 0,timeSeconds:we.timeSeconds,memoryBytes:we.memoryBytes,feedbackMarkdown:Re.feedbackMarkdown,outputFiles:null!=(le=Re.outputFiles)?le:Ie.length>0?Ie:void 0}),e.n=51,p(f.cwd,Q);case 51:if(Me===R.ACCEPTED){e.n=52;break}return e.a(3,53);case 52:e.n=27;break;case 53:e.n=55;break;case 54:e.p=54,We=e.v,Z.e(We);case 55:return e.p=55,Z.f(),e.f(55);case 56:e.n=58;break;case 57:return e.p=57,qe=e.v,k({testCaseId:K,decisionCode:R.RUNTIME_ERROR,stdin:V,stderr:z(qe)}),e.n=58,p(f.cwd,Q);case 58:return e.p=58,e.n=59,null==(De=H)?void 0:De.dispose();case 59:return e.f(58);case 60:return e.a(2)}},e,null,[[47,49],[38,43],[26,54,55,56],[22,57,58,60],[11,14]])}))).apply(this,arguments)}function D(e){return T.apply(this,arguments)}function T(){return(T=e(n().m(function e(t){var r;return n().w(function(e){for(;;)switch(e.n){case 0:if(!t.configuredMainFilePath){e.n=3;break}return r=d.join(t.cwd,t.configuredMainFilePath),e.n=1,K(r);case 1:if(!e.v){e.n=2;break}return e.a(2,t.configuredMainFilePath);case 2:if(t.allowConfiguredPathFallback){e.n=3;break}return e.a(2,void 0);case 3:return e.n=4,v(t.cwd,t.language);case 4:return e.a(2,e.v)}},e)}))).apply(this,arguments)}function L(e){var n=Object.entries(S).filter(function(n){return i(n,2)[1].fileExtensions.some(function(n){return e.endsWith(n)})}).map(function(e){return i(e,1)[0]});return n.length>0?n:void 0}function x(e){var n,t,r=null==(n=(t=e.languageDefinition).buildCommand)?void 0:n.call(t,e.mainFilePath);if(r){var i=E(r[0],r.slice(1),{cwd:e.cwd,encoding:"utf8",env:e.env},10);return i.timeSeconds>10?{decisionCode:R.BUILD_TIME_LIMIT_EXCEEDED,stderr:i.stderr||void 0}:0!==i.status?{decisionCode:R.BUILD_ERROR,stderr:i.stderr||i.stdout||void 0}:void 0}}function O(e){var n,t,r;if("timeout"===e.runResult.stopReason)return{decisionCode:R.TIME_LIMIT_EXCEEDED,stderr:e.runResult.stderr};if(0!==e.runResult.status)return{decisionCode:R.RUNTIME_ERROR,stderr:e.runResult.stderr};if(e.runResult.memoryBytes>(null!=(n=e.context.problemMarkdownFrontMatter.memoryLimitByte)?n:Number.POSITIVE_INFINITY))return{decisionCode:R.MEMORY_LIMIT_EXCEEDED,stderr:e.runResult.stderr};var i=null!=(t=null==(r=e.context.problemMarkdownFrontMatter.requiredOutputFilePaths)?void 0:r.length)?t:0;return e.outputFiles.length<i?{decisionCode:R.MISSING_REQUIRED_OUTPUT_FILE_ERROR}:{decisionCode:R.ACCEPTED}}function j(e){return N.apply(this,arguments)}function N(){return(N=e(n().m(function e(t){return n().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,y(d.join(t,"test_cases"));case 1:return e.a(2,e.v)}},e)}))).apply(this,arguments)}function B(e){return U.apply(this,arguments)}function U(){return(U=e(n().m(function e(t){var r,i,u,c,d,f,p,m,h,v,w,b,g,k,C,I;return n().w(function(e){for(;;)switch(e.n){case 0:r=["timeout",t.timeLimitSeconds.toFixed(3)].concat(F,a(t.command)),(i=o.spawn(r[0],r.slice(1),{cwd:t.cwd,env:t.env,detached:"win32"!==process.platform,stdio:["pipe","pipe","pipe"]})).stdout.setEncoding("utf8"),i.stderr.setEncoding("utf8"),u="",c="",p="process_exit",m=[],h=[],v=Date.now()/1e3,w=0,i.stdout.on("data",function(e){u+=e}),i.stderr.on("data",function(e){c+=e}),i.on("error",function(e){f=e,d=1}),i.on("close",function(e,n){return 124===e?(p="timeout",void(d=0)):n?(d=1,void(c=c?"".concat(c,"\nprocess terminated by signal: ").concat(n):"process terminated by signal: ".concat(n))):void(d=null!=e?e:1)}),t.stdin&&i.stdin.write(t.stdin),i.stdin.end(),b=n().m(function e(){var r,s;return n().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,l(1e3*t.screenshotWaitSeconds);case 1:if(w=Math.max(w,Q(i.pid)),r=A(t.env.DISPLAY),!((h=r.toSorted(function(e,n){return e.data.length-n.data.length})).length>0)){e.n=2;break}if(s=h.map(function(e){return e.data}).toSorted(),m.unshift(s),m.length=Math.min(m.length,t.stopDetectionThreshold),m.length!==t.stopDetectionThreshold||!m.every(function(e){return e.length===s.length&&e.every(function(e,n){return e===s[n]})})){e.n=2;break}return p="stable_screenshot",d=0,e.a(2,0);case 2:if(!(Date.now()/1e3-v>t.timeLimitSeconds)){e.n=3;break}return p="timeout",d=0,e.a(2,0);case 3:return e.a(2)}},e)});case 1:if(void 0!==d){e.n=4;break}return e.d(s(b()),2);case 2:if(0!==e.v){e.n=3;break}return e.a(3,4);case 3:e.n=1;break;case 4:return"process_exit"!==p&&null===i.exitCode&&(i.removeAllListeners("close"),i.removeAllListeners("error")),e.n=5,X(i);case 5:if(!f){e.n=6;break}throw f;case 6:return g=G(c,v,w),k=g.memoryBytes,C=g.stderr,I=g.timeSeconds,e.a(2,{stdin:t.stdin,stdout:u.trimEnd(),stderr:C,status:d,timeSeconds:I,memoryBytes:k,screenshots:h,stopReason:p})}},e)}))).apply(this,arguments)}function A(e){var n=e?r(r({},process.env),{},{DISPLAY:e}):process.env,i=o.spawnSync("xwininfo",["-root","-tree"],{encoding:"utf8",env:n});if(i.error)throw i.error;if(0!==i.status||!i.stdout)return[];for(var s=[],a=0,u=function(e){var n,r=[],i=e.split("\n"),s=t(i);try{for(s.s();!(n=s.n()).done;){var a=n.value;if(!(a.includes("Root window id:")||a.includes("Parent window id:")||a.includes("()"))){var o=/^\s{5}(0x[\da-f]+) /.exec(a);null!=o&&o[1]&&r.push(Number.parseInt(o[1],16).toString())}}}catch(e){s.e(e)}finally{s.f()}return r}(i.stdout);a<u.length;a++){var c=u[a],d=o.spawnSync("maim",["-i",c],{env:n});if(d.error)throw d.error;if(0===d.status&&0!==d.stdout.length){var l=o.spawnSync("xdotool",["getwindowname",c],{encoding:"utf8",env:n});if(l.error)throw l.error;var f=l.stdout.trim().replaceAll(/[\s/]/g,"_");s.push({path:"".concat(f||"window","_").concat(c,".png"),data:d.stdout.toString("base64"),encoding:"base64"})}}return s}function G(e,n,t){var r=/(?:^|\n)(\d+\.\d+) (\d+)\s*$/.exec(e),i=r?e.slice(0,r.index).trimEnd():e.trimEnd(),s=1024*Number(null==r?void 0:r[2])||0;return{stderr:i,timeSeconds:Number(null==r?void 0:r[1])||Date.now()/1e3-n,memoryBytes:Math.max(s,t)}}function W(){return q.apply(this,arguments)}function q(){return q=e(n().m(function t(){var r,i,a;return n().w(function(t){for(;;)switch(t.n){case 0:if("linux"===process.platform){t.n=1;break}throw new Error("GUI screenshot capture is supported only on Linux.");case 1:r=n().m(function t(){var r,i,s;return n().w(function(t){for(;;)switch(t.n){case 0:return r=":".concat(a),(s=o.spawn("Xvfb",[r,"-screen","0","1280x1024x24","-ac"],{stdio:"ignore"})).on("error",function(e){i=e}),t.n=1,l(300);case 1:if(!i){t.n=2;break}throw i;case 2:if(null===s.exitCode){t.n=3;break}return t.a(2,0);case 3:return t.a(2,{v:{display:r,dispose:function(){var t=e(n().m(function e(){return n().w(function(e){for(;;)switch(e.n){case 0:if(s.killed){e.n=2;break}return s.kill("SIGTERM"),e.n=1,l(100);case 1:null===s.exitCode&&s.kill("SIGKILL");case 2:return e.a(2)}},e)}));return function(){return t.apply(this,arguments)}}()}})}},t)}),a=90;case 2:if(!(a<100)){t.n=6;break}return t.d(s(r()),3);case 3:if(0!==(i=t.v)){t.n=4;break}return t.a(3,5);case 4:if(!i){t.n=5;break}return t.a(2,i.v);case 5:a++,t.n=2;break;case 6:throw new Error("Xvfb could not be started.");case 7:return t.a(2)}},t)})),q.apply(this,arguments)}function X(e){return Y.apply(this,arguments)}function Y(){return(Y=e(n().m(function e(t){return n().w(function(e){for(;;)switch(e.n){case 0:if(t.pid){e.n=1;break}return e.a(2);case 1:return H(t.pid,"SIGTERM"),e.n=2,l(200);case 2:null===t.exitCode&&H(t.pid,"SIGKILL");case 3:return e.a(2)}},e)}))).apply(this,arguments)}function Q(e){if(!e||"linux"!==process.platform)return 0;var n=o.spawnSync("ps",["-o","rss=","--no-headers","--pgroup",String(e)],{encoding:"utf8"});return n.error||0!==n.status||!n.stdout?0:n.stdout.split("\n").map(function(e){return Number(e.trim())}).filter(function(e){return Number.isFinite(e)&&e>0}).reduce(function(e,n){return e+1024*n},0)}function H(e,n){try{if("win32"!==process.platform)return void process.kill(-e,n)}catch(e){}try{process.kill(e,n)}catch(e){}}function K(e){return V.apply(this,arguments)}function V(){return(V=e(n().m(function e(t){return n().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,u.access(t);case 1:return e.a(2,!0);case 2:return e.p=2,e.v,e.a(2,!1)}},e,null,[[0,2]])}))).apply(this,arguments)}function z(e){return e instanceof Error?e.message:String(e)}export{P as guiCommandJudgePreset};
2
+ //# sourceMappingURL=guiCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guiCommand.js","sources":["../../src/presets/guiCommand.ts"],"sourcesContent":["import childProcess from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport { z } from 'zod';\n\nimport { cleanWorkingDirectory, snapshotWorkingDirectory } from '../helpers/cleanWorkingDirectory.js';\nimport { copyTestCaseFileInput } from '../helpers/copyTestCaseFileInput.js';\nimport { findEntryPointFile } from '../helpers/findEntryPointFile.js';\nimport { findLanguageDefinitionByPath } from '../helpers/findLanguageDefinitionByPath.js';\nimport { judgeByStaticAnalysis } from '../helpers/judgeByStaticAnalysis.js';\nimport { parseArgs } from '../helpers/parseArgs.js';\nimport { printTestCaseResult } from '../helpers/printTestCaseResult.js';\nimport { readOutputFiles } from '../helpers/readOutputFiles.js';\nimport { readProblemMarkdownFrontMatter } from '../helpers/readProblemMarkdownFrontMatter.js';\nimport { readTestCases as readFileTestCases } from '../helpers/readTestCases.js';\nimport { spawnSyncWithTimeout } from '../helpers/spawnSyncWithTimeout.js';\nimport { DecisionCode } from '../types/decisionCode.js';\nimport { languageIdToDefinition } from '../types/language.js';\nimport type { ProblemMarkdownFrontMatter } from '../types/problem.js';\nimport type { TestCaseResult } from '../types/testCaseResult.js';\n\nconst BUILD_TIMEOUT_SECONDS = 10;\nconst JUDGE_DEFAULT_TIMEOUT_SECONDS = 5;\nconst SCREENSHOT_WAIT_SECONDS = 0.3;\nconst XVFB_STARTUP_WAIT_SECONDS = 0.3;\nconst XVFB_SHUTDOWN_WAIT_SECONDS = 0.1;\nconst PROCESS_SHUTDOWN_WAIT_SECONDS = 0.2;\nconst STOP_DETECTION_THRESHOLD = 5;\nconst TIME_COMMAND = [os.platform() === 'darwin' ? 'gtime' : '/usr/bin/time', '--format', '%e %M'] as const;\n\nconst judgeParamsSchema = z.object({\n language: z.union([z.string(), z.array(z.string())]).optional(),\n});\n\ninterface BaseGuiTestCase {\n id: string;\n input?: string;\n fileInputPath?: string;\n}\n\nexport interface GuiScreenshotFile {\n path: string;\n data: string;\n encoding: 'base64';\n}\n\nexport interface GuiCommandRunResult {\n stdin: string;\n stdout: string;\n stderr: string;\n status: number | undefined;\n timeSeconds: number;\n memoryBytes: number;\n screenshots: GuiScreenshotFile[];\n stopReason: 'process_exit' | 'stable_screenshot' | 'timeout';\n}\n\ninterface GuiJudgeContext {\n timeLimitSeconds: number;\n problemMarkdownFrontMatter: Pick<ProblemMarkdownFrontMatter, 'memoryLimitByte' | 'requiredOutputFilePaths'>;\n}\n\ntype GuiJudgeCaseResult = Pick<\n TestCaseResult,\n 'decisionCode' | 'feedbackMarkdown' | 'stderr' | 'stdout' | 'outputFiles'\n>;\n\nexport interface GuiCommandJudgePresetOptions<TTestCase extends BaseGuiTestCase = BaseGuiTestCase> {\n mainFilePath?: string;\n runTimeoutSeconds?: number;\n screenshotWaitSeconds?: number;\n stopDetectionThreshold?: number;\n readTestCases?: (problemDir: string) => Promise<readonly TTestCase[]>;\n prepare?: (context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n problemMarkdownFrontMatter: ProblemMarkdownFrontMatter;\n }) => Promise<Partial<GuiJudgeCaseResult> | undefined> | Partial<GuiJudgeCaseResult> | undefined;\n resolveInput?: (context: { testCase: TTestCase; cwd: string; env: NodeJS.ProcessEnv }) => Promise<string> | string;\n command?: (context: {\n testCase: TTestCase;\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n }) => Promise<readonly [string, ...string[]]> | readonly [string, ...string[]];\n runCommand?: (context: {\n testCase: TTestCase;\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n }) => Promise<GuiCommandRunResult> | GuiCommandRunResult;\n test: (context: {\n testCase: TTestCase;\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n }) => Promise<Partial<GuiJudgeCaseResult>> | Partial<GuiJudgeCaseResult>;\n}\n\n/**\n * A preset function for judging GUI programs by collecting screenshots while the program runs.\n *\n * Keep problem-specific logic in `prepare`, `command`, and `test`.\n *\n * @example\n * Create `judge.ts`:\n * ```ts\n * import { DecisionCode } from '@exercode/problem-utils';\n * import { guiCommandJudgePreset } from '@exercode/problem-utils/presets/guiCommand';\n *\n * await guiCommandJudgePreset(import.meta.dirname, {\n * mainFilePath: 'Main.java',\n * readTestCases: async () => [{ id: 'default' }],\n * test: ({ runResult }) => {\n * return runResult.screenshots.length > 0\n * ? { decisionCode: DecisionCode.ACCEPTED }\n * : { decisionCode: DecisionCode.WRONG_ANSWER };\n * },\n * });\n * ```\n */\nexport async function guiCommandJudgePreset<TTestCase extends BaseGuiTestCase = BaseGuiTestCase>(\n problemDir: string,\n options: GuiCommandJudgePresetOptions<TTestCase>\n): Promise<void> {\n const args = parseArgs(process.argv);\n const params = judgeParamsSchema.parse(args.params);\n\n const problemMarkdownFrontMatter = await readProblemMarkdownFrontMatter(problemDir);\n const configuredTestCases = await (options.readTestCases ?? readGuiTestCases<TTestCase>)(problemDir);\n const testCases =\n configuredTestCases.length > 0 ? configuredTestCases : ([{ id: 'default' }] as unknown as readonly TTestCase[]);\n const prebuildTestCaseId = testCases[0]?.id ?? 'prebuild';\n\n const staticAnalysisResult = await judgeByStaticAnalysis(args.cwd, problemMarkdownFrontMatter);\n if (staticAnalysisResult) {\n printTestCaseResult({ testCaseId: prebuildTestCaseId, ...staticAnalysisResult });\n return;\n }\n\n const initialMainFilePath = options.mainFilePath ?? (await findEntryPointFile(args.cwd, params.language));\n if (!initialMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const languageDefinition = findLanguageDefinitionByPath(initialMainFilePath);\n if (!languageDefinition) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.WRONG_ANSWER,\n stderr: 'unsupported language',\n });\n return;\n }\n\n const env = { ...process.env, CI: '', FORCE_COLOR: '0' };\n\n let resolvedMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language,\n configuredMainFilePath: options.mainFilePath,\n });\n if (languageDefinition.prebuild) {\n try {\n await languageDefinition.prebuild(args.cwd);\n const prebuiltMainFilePath = await resolveMainFilePath({\n cwd: args.cwd,\n language: params.language ?? inferLanguageIdsByPath(initialMainFilePath),\n configuredMainFilePath: options.mainFilePath,\n allowConfiguredPathFallback: true,\n });\n if (prebuiltMainFilePath) resolvedMainFilePath = prebuiltMainFilePath;\n } catch (error) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: errorToMessage(error),\n });\n return;\n }\n }\n if (!resolvedMainFilePath) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: DecisionCode.MISSING_REQUIRED_SUBMISSION_FILE_ERROR,\n stderr: options.mainFilePath\n ? `required main file not found: ${options.mainFilePath}`\n : `main file not found${params.language ? `: language: ${params.language}` : ''}`,\n });\n return;\n }\n\n const prepareResult =\n (await options.prepare?.({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n problemMarkdownFrontMatter,\n })) ??\n runDefaultPrepare({\n cwd: args.cwd,\n env,\n mainFilePath: resolvedMainFilePath,\n languageDefinition,\n });\n if (prepareResult) {\n printTestCaseResult({\n testCaseId: prebuildTestCaseId,\n decisionCode: prepareResult.decisionCode ?? DecisionCode.BUILD_ERROR,\n feedbackMarkdown: prepareResult.feedbackMarkdown,\n stderr: prepareResult.stderr,\n stdout: prepareResult.stdout,\n outputFiles: prepareResult.outputFiles,\n });\n return;\n }\n\n const cwdSnapshot = await snapshotWorkingDirectory(args.cwd);\n let displayServer: Awaited<ReturnType<typeof ensureDisplayServer>> | undefined;\n let currentTestCaseId = prebuildTestCaseId;\n let currentStdin: string | undefined;\n try {\n displayServer = options.runCommand ? undefined : await ensureDisplayServer();\n const sharedFileInputPath = (configuredTestCases as { shared?: { fileInputPath?: string } }).shared?.fileInputPath;\n for (const testCase of testCases) {\n currentTestCaseId = testCase.id;\n if (sharedFileInputPath) await copyTestCaseFileInput(sharedFileInputPath, args.cwd);\n if (testCase.fileInputPath) await copyTestCaseFileInput(testCase.fileInputPath, args.cwd);\n\n const timeLimitSeconds =\n typeof problemMarkdownFrontMatter.timeLimitMs === 'number'\n ? problemMarkdownFrontMatter.timeLimitMs / 1000\n : (options.runTimeoutSeconds ?? JUDGE_DEFAULT_TIMEOUT_SECONDS);\n\n const runEnv = displayServer ? { ...env, DISPLAY: displayServer.display } : env;\n const stdin = (await options.resolveInput?.({ testCase, cwd: args.cwd, env: runEnv })) ?? testCase.input ?? '';\n currentStdin = stdin;\n const command =\n (await options.command?.({ testCase, cwd: args.cwd, env: runEnv, mainFilePath: resolvedMainFilePath })) ??\n languageDefinition.command(resolvedMainFilePath);\n\n let runResult: GuiCommandRunResult;\n try {\n runResult = options.runCommand\n ? await options.runCommand({\n testCase,\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n })\n : await spawnGuiProgram({\n command,\n stdin,\n cwd: args.cwd,\n env: runEnv,\n timeLimitSeconds,\n screenshotWaitSeconds: options.screenshotWaitSeconds ?? SCREENSHOT_WAIT_SECONDS,\n stopDetectionThreshold: options.stopDetectionThreshold ?? STOP_DETECTION_THRESHOLD,\n });\n } catch (error) {\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n return;\n }\n\n const outputFiles = await readOutputFiles(args.cwd, problemMarkdownFrontMatter.requiredOutputFilePaths ?? []);\n const judgeContext: GuiJudgeContext = {\n timeLimitSeconds,\n problemMarkdownFrontMatter: {\n memoryLimitByte: problemMarkdownFrontMatter.memoryLimitByte,\n requiredOutputFilePaths: problemMarkdownFrontMatter.requiredOutputFilePaths,\n },\n };\n const baseJudgeResult = evaluateGuiRunResult({ runResult, outputFiles, context: judgeContext });\n let judgeResult = baseJudgeResult;\n if (baseJudgeResult.decisionCode === DecisionCode.ACCEPTED) {\n try {\n const extendedJudgeResult = await options.test({\n testCase,\n runResult,\n outputFiles,\n context: judgeContext,\n });\n judgeResult = {\n decisionCode: extendedJudgeResult.decisionCode ?? baseJudgeResult.decisionCode,\n feedbackMarkdown: extendedJudgeResult.feedbackMarkdown,\n stderr: extendedJudgeResult.stderr,\n stdout: extendedJudgeResult.stdout,\n outputFiles: extendedJudgeResult.outputFiles,\n };\n } catch (error) {\n judgeResult = {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: errorToMessage(error),\n };\n }\n }\n\n const decisionCode = judgeResult.decisionCode ?? DecisionCode.ACCEPTED;\n const stdout = judgeResult.stdout ?? runResult.stdout;\n const stderr = judgeResult.stderr ?? runResult.stderr;\n printTestCaseResult({\n testCaseId: testCase.id,\n decisionCode,\n exitStatus: runResult.status,\n stdin: runResult.stdin || undefined,\n stdout: stdout || undefined,\n stderr: stderr || undefined,\n timeSeconds: runResult.timeSeconds,\n memoryBytes: runResult.memoryBytes,\n feedbackMarkdown: judgeResult.feedbackMarkdown,\n outputFiles: judgeResult.outputFiles ?? (outputFiles.length > 0 ? outputFiles : undefined),\n });\n\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n if (decisionCode !== DecisionCode.ACCEPTED) break;\n }\n } catch (error) {\n printTestCaseResult({\n testCaseId: currentTestCaseId,\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stdin: currentStdin,\n stderr: errorToMessage(error),\n });\n await cleanWorkingDirectory(args.cwd, cwdSnapshot);\n } finally {\n await displayServer?.dispose();\n }\n}\n\nasync function resolveMainFilePath(context: {\n cwd: string;\n language?: string | string[];\n configuredMainFilePath?: string;\n allowConfiguredPathFallback?: boolean;\n}): Promise<string | undefined> {\n if (context.configuredMainFilePath) {\n const resolvedPath = path.join(context.cwd, context.configuredMainFilePath);\n if (await pathExists(resolvedPath)) return context.configuredMainFilePath;\n if (!context.allowConfiguredPathFallback) return undefined;\n }\n\n return await findEntryPointFile(context.cwd, context.language);\n}\n\nfunction inferLanguageIdsByPath(filePath: string): string[] | undefined {\n const languageIds = Object.entries(languageIdToDefinition)\n .filter(([, definition]) => definition.fileExtensions.some((ext) => filePath.endsWith(ext)))\n .map(([languageId]) => languageId);\n return languageIds.length > 0 ? languageIds : undefined;\n}\n\nfunction runDefaultPrepare(context: {\n cwd: string;\n env: NodeJS.ProcessEnv;\n mainFilePath: string;\n languageDefinition: NonNullable<ReturnType<typeof findLanguageDefinitionByPath>>;\n}): Partial<GuiJudgeCaseResult> | undefined {\n const buildCommand = context.languageDefinition.buildCommand?.(context.mainFilePath);\n if (!buildCommand) return undefined;\n\n const buildResult = spawnSyncWithTimeout(\n buildCommand[0],\n buildCommand.slice(1),\n { cwd: context.cwd, encoding: 'utf8', env: context.env },\n BUILD_TIMEOUT_SECONDS\n );\n\n if (buildResult.timeSeconds > BUILD_TIMEOUT_SECONDS) {\n return {\n decisionCode: DecisionCode.BUILD_TIME_LIMIT_EXCEEDED,\n stderr: buildResult.stderr || undefined,\n };\n }\n\n if (buildResult.status !== 0) {\n return {\n decisionCode: DecisionCode.BUILD_ERROR,\n stderr: buildResult.stderr || buildResult.stdout || undefined,\n };\n }\n\n return undefined;\n}\n\nfunction evaluateGuiRunResult(context: {\n runResult: GuiCommandRunResult;\n outputFiles: NonNullable<TestCaseResult['outputFiles']>;\n context: GuiJudgeContext;\n}): Partial<GuiJudgeCaseResult> {\n if (context.runResult.stopReason === 'timeout') {\n return {\n decisionCode: DecisionCode.TIME_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n if (context.runResult.status !== 0) {\n return {\n decisionCode: DecisionCode.RUNTIME_ERROR,\n stderr: context.runResult.stderr,\n };\n }\n\n if (\n context.runResult.memoryBytes >\n (context.context.problemMarkdownFrontMatter.memoryLimitByte ?? Number.POSITIVE_INFINITY)\n ) {\n return {\n decisionCode: DecisionCode.MEMORY_LIMIT_EXCEEDED,\n stderr: context.runResult.stderr,\n };\n }\n\n const requiredOutputFilesCount = context.context.problemMarkdownFrontMatter.requiredOutputFilePaths?.length ?? 0;\n if (context.outputFiles.length < requiredOutputFilesCount) {\n return {\n decisionCode: DecisionCode.MISSING_REQUIRED_OUTPUT_FILE_ERROR,\n };\n }\n\n return { decisionCode: DecisionCode.ACCEPTED };\n}\n\nasync function readGuiTestCases<TTestCase extends BaseGuiTestCase>(problemDir: string): Promise<readonly TTestCase[]> {\n return (await readFileTestCases(path.join(problemDir, 'test_cases'))) as unknown as readonly TTestCase[];\n}\n\nasync function spawnGuiProgram(context: {\n command: readonly [string, ...string[]];\n stdin: string;\n cwd: string;\n env: NodeJS.ProcessEnv;\n timeLimitSeconds: number;\n screenshotWaitSeconds: number;\n stopDetectionThreshold: number;\n}): Promise<GuiCommandRunResult> {\n const wrappedCommand = ['timeout', context.timeLimitSeconds.toFixed(3), ...TIME_COMMAND, ...context.command] as const;\n const child = childProcess.spawn(wrappedCommand[0], wrappedCommand.slice(1), {\n cwd: context.cwd,\n env: context.env,\n detached: process.platform !== 'win32',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n let spawnError: Error | undefined;\n let stopReason: GuiCommandRunResult['stopReason'] = 'process_exit';\n const screenshotSignaturesHistory: string[][] = [];\n let screenshots: GuiScreenshotFile[] = [];\n const startTimeSeconds = Date.now() / 1000;\n let sampledMemoryBytes = 0;\n\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', (error) => {\n spawnError = error;\n exitCode = 1;\n });\n child.on('close', (code, signal) => {\n if (code === 124) {\n stopReason = 'timeout';\n exitCode = 0;\n return;\n }\n if (signal) {\n exitCode = 1;\n stderr = stderr\n ? `${stderr}\\nprocess terminated by signal: ${signal}`\n : `process terminated by signal: ${signal}`;\n return;\n }\n exitCode = code ?? 1;\n });\n\n if (context.stdin) child.stdin.write(context.stdin);\n child.stdin.end();\n\n while (exitCode === undefined) {\n await wait(context.screenshotWaitSeconds * 1000);\n sampledMemoryBytes = Math.max(sampledMemoryBytes, readProcessGroupMemoryBytes(child.pid));\n const currentScreenshots = takeScreenshots(context.env.DISPLAY);\n screenshots = currentScreenshots.toSorted((a, b) => a.data.length - b.data.length);\n\n if (screenshots.length > 0) {\n const screenshotSignatures = screenshots.map((file) => file.data).toSorted();\n screenshotSignaturesHistory.unshift(screenshotSignatures);\n screenshotSignaturesHistory.length = Math.min(screenshotSignaturesHistory.length, context.stopDetectionThreshold);\n if (\n screenshotSignaturesHistory.length === context.stopDetectionThreshold &&\n screenshotSignaturesHistory.every(\n (files) =>\n files.length === screenshotSignatures.length &&\n files.every((file, index) => file === screenshotSignatures[index])\n )\n ) {\n stopReason = 'stable_screenshot';\n exitCode = 0;\n break;\n }\n }\n\n if (Date.now() / 1000 - startTimeSeconds > context.timeLimitSeconds) {\n stopReason = 'timeout';\n exitCode = 0;\n break;\n }\n }\n\n if (stopReason !== 'process_exit' && child.exitCode === null) {\n child.removeAllListeners('close');\n child.removeAllListeners('error');\n }\n await stopProcess(child);\n if (spawnError) throw spawnError;\n const {\n memoryBytes,\n stderr: normalizedStderr,\n timeSeconds,\n } = parseTimedStderr(stderr, startTimeSeconds, sampledMemoryBytes);\n\n return {\n stdin: context.stdin,\n stdout: stdout.trimEnd(),\n stderr: normalizedStderr,\n status: exitCode,\n timeSeconds,\n memoryBytes,\n screenshots,\n stopReason,\n };\n}\n\nfunction takeScreenshots(display: string | undefined): GuiScreenshotFile[] {\n const env = display ? { ...process.env, DISPLAY: display } : process.env;\n const xwininfo = childProcess.spawnSync('xwininfo', ['-root', '-tree'], { encoding: 'utf8', env });\n if (xwininfo.error) throw xwininfo.error;\n if (xwininfo.status !== 0 || !xwininfo.stdout) return [];\n\n const screenshots: GuiScreenshotFile[] = [];\n for (const windowId of extractTopLevelWindowIds(xwininfo.stdout)) {\n const screenshot = childProcess.spawnSync('maim', ['-i', windowId], { env });\n if (screenshot.error) throw screenshot.error;\n if (screenshot.status !== 0 || screenshot.stdout.length === 0) continue;\n\n const windowNameResult = childProcess.spawnSync('xdotool', ['getwindowname', windowId], { encoding: 'utf8', env });\n if (windowNameResult.error) throw windowNameResult.error;\n const windowName = windowNameResult.stdout.trim().replaceAll(/[\\s/]/g, '_');\n\n screenshots.push({\n path: `${windowName || 'window'}_${windowId}.png`,\n data: screenshot.stdout.toString('base64'),\n encoding: 'base64',\n });\n }\n\n return screenshots;\n}\n\nfunction extractTopLevelWindowIds(stdout: string): string[] {\n const windowIds: string[] = [];\n const lines = stdout.split('\\n');\n for (const line of lines) {\n if (line.includes('Root window id:') || line.includes('Parent window id:') || line.includes('()')) continue;\n\n const match = /^\\s{5}(0x[\\da-f]+) /.exec(line);\n if (!match?.[1]) continue;\n windowIds.push(Number.parseInt(match[1], 16).toString());\n }\n return windowIds;\n}\n\nfunction parseTimedStderr(\n stderr: string,\n startTimeSeconds: number,\n sampledMemoryBytes: number\n): Pick<GuiCommandRunResult, 'stderr' | 'timeSeconds' | 'memoryBytes'> {\n const match = /(?:^|\\n)(\\d+\\.\\d+) (\\d+)\\s*$/.exec(stderr);\n const normalizedStderr = match ? stderr.slice(0, match.index).trimEnd() : stderr.trimEnd();\n const parsedMemoryBytes = Number(match?.[2]) * 1024 || 0;\n return {\n stderr: normalizedStderr,\n timeSeconds: Number(match?.[1]) || Date.now() / 1000 - startTimeSeconds,\n memoryBytes: Math.max(parsedMemoryBytes, sampledMemoryBytes),\n };\n}\n\nasync function ensureDisplayServer(): Promise<{ display: string; dispose: () => Promise<void> }> {\n if (process.platform !== 'linux') {\n throw new Error('GUI screenshot capture is supported only on Linux.');\n }\n\n for (let displayNumber = 90; displayNumber < 100; displayNumber++) {\n const display = `:${displayNumber}`;\n let spawnError: Error | undefined;\n const xvfb = childProcess.spawn('Xvfb', [display, '-screen', '0', '1280x1024x24', '-ac'], {\n stdio: 'ignore',\n });\n xvfb.on('error', (error) => {\n spawnError = error;\n });\n\n await wait(XVFB_STARTUP_WAIT_SECONDS * 1000);\n if (spawnError) throw spawnError;\n if (xvfb.exitCode !== null) continue;\n\n return {\n display,\n dispose: async () => {\n if (!xvfb.killed) {\n xvfb.kill('SIGTERM');\n await wait(XVFB_SHUTDOWN_WAIT_SECONDS * 1000);\n if (xvfb.exitCode === null) xvfb.kill('SIGKILL');\n }\n },\n };\n }\n\n throw new Error('Xvfb could not be started.');\n}\n\nasync function stopProcess(child: childProcess.ChildProcess): Promise<void> {\n if (!child.pid) return;\n killProcessGroup(child.pid, 'SIGTERM');\n await wait(PROCESS_SHUTDOWN_WAIT_SECONDS * 1000);\n if (child.exitCode === null) killProcessGroup(child.pid, 'SIGKILL');\n}\n\nfunction readProcessGroupMemoryBytes(processGroupId: number | undefined): number {\n if (!processGroupId || process.platform !== 'linux') return 0;\n\n const result = childProcess.spawnSync('ps', ['-o', 'rss=', '--no-headers', '--pgroup', String(processGroupId)], {\n encoding: 'utf8',\n });\n if (result.error || result.status !== 0 || !result.stdout) return 0;\n\n return result.stdout\n .split('\\n')\n .map((line) => Number(line.trim()))\n .filter((value) => Number.isFinite(value) && value > 0)\n .reduce((sum, value) => sum + value * 1024, 0);\n}\n\nfunction killProcessGroup(processGroupId: number, signal: NodeJS.Signals): void {\n try {\n if (process.platform !== 'win32') {\n process.kill(-processGroupId, signal);\n return;\n }\n } catch {\n // The process group may already be gone. Fall back to the direct PID below.\n }\n\n try {\n process.kill(processGroupId, signal);\n } catch {\n // The direct child may also already be gone.\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction errorToMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"names":["TIME_COMMAND","os","platform","judgeParamsSchema","z","object","language","union","string","array","optional","guiCommandJudgePreset","_x","_x2","_guiCommandJudgePreset","apply","this","arguments","_asyncToGenerator","_regenerator","m","_callee","problemDir","options","_options$readTestCase","_testCases$0$id","_testCases$","_options$mainFilePath","_yield$options$prepar","_options$prepare","args","params","problemMarkdownFrontMatter","configuredTestCases","testCases","prebuildTestCaseId","staticAnalysisResult","initialMainFilePath","languageDefinition","env","resolvedMainFilePath","_params$language","prebuiltMainFilePath","prepareResult","_prepareResult$decisi","cwdSnapshot","displayServer","currentTestCaseId","currentStdin","_shared","sharedFileInputPath","_iterator2","_step2","_options$runTimeoutSe","_ref5","_yield$options$resolv","_options$resolveInput","_yield$options$comman","_options$command","_problemMarkdownFront","_judgeResult$decision","_judgeResult$stdout","_judgeResult$stderr","_judgeResult$outputFi","testCase","timeLimitSeconds","runEnv","stdin","command","runResult","_options$screenshotWa","_options$stopDetectio","_options$screenshotWa2","_options$stopDetectio2","outputFiles","judgeContext","baseJudgeResult","judgeResult","_extendedJudgeResult$","extendedJudgeResult","decisionCode","stdout","stderr","_displayServer","_t","_t2","_t4","_t5","_t7","_t9","_t1","_t10","_t11","_t12","_t13","_t14","w","_context","p","n","parseArgs","process","argv","parse","readProblemMarkdownFrontMatter","v","readTestCases","readGuiTestCases","length","id","judgeByStaticAnalysis","cwd","printTestCaseResult","_objectSpread","testCaseId","a","mainFilePath","findEntryPointFile","DecisionCode","MISSING_REQUIRED_SUBMISSION_FILE_ERROR","concat","findLanguageDefinitionByPath","WRONG_ANSWER","CI","FORCE_COLOR","resolveMainFilePath","configuredMainFilePath","prebuild","inferLanguageIdsByPath","allowConfiguredPathFallback","BUILD_ERROR","errorToMessage","prepare","call","runDefaultPrepare","feedbackMarkdown","snapshotWorkingDirectory","runCommand","undefined","ensureDisplayServer","shared","fileInputPath","_createForOfIteratorHelper","s","done","value","copyTestCaseFileInput","timeLimitMs","runTimeoutSeconds","DISPLAY","display","resolveInput","input","screenshotWaitSeconds","stopDetectionThreshold","spawnGuiProgram","RUNTIME_ERROR","cleanWorkingDirectory","readOutputFiles","requiredOutputFilePaths","memoryLimitByte","evaluateGuiRunResult","context","ACCEPTED","test","exitStatus","status","timeSeconds","memoryBytes","e","f","dispose","_x3","_resolveMainFilePath","_callee2","resolvedPath","_context2","path","join","pathExists","filePath","languageIds","Object","entries","languageIdToDefinition","filter","_ref","_slicedToArray","fileExtensions","some","ext","endsWith","map","_ref3","_context$languageDefi","_context$languageDefi2","buildCommand","buildResult","spawnSyncWithTimeout","slice","encoding","BUILD_TIME_LIMIT_EXCEEDED","_context$context$prob","_context$context$prob2","_context$context$prob3","stopReason","TIME_LIMIT_EXCEEDED","Number","POSITIVE_INFINITY","MEMORY_LIMIT_EXCEEDED","requiredOutputFilesCount","MISSING_REQUIRED_OUTPUT_FILE_ERROR","_x4","_readGuiTestCases","_callee3","_context3","readFileTestCases","_x5","_spawnGuiProgram","_callee4","wrappedCommand","child","exitCode","spawnError","screenshotSignaturesHistory","screenshots","startTimeSeconds","sampledMemoryBytes","_loop","_parseTimedStderr","normalizedStderr","_context5","toFixed","_toConsumableArray","childProcess","spawn","detached","stdio","setEncoding","Date","now","on","chunk","error","code","signal","write","end","currentScreenshots","screenshotSignatures","_context4","wait","Math","max","readProcessGroupMemoryBytes","pid","takeScreenshots","toSorted","b","data","file","unshift","min","every","files","index","d","_regeneratorValues","removeAllListeners","stopProcess","parseTimedStderr","trimEnd","xwininfo","spawnSync","_i","_extractTopLevelWindo","_step","windowIds","lines","split","_iterator","line","includes","match","exec","push","parseInt","toString","err","extractTopLevelWindowIds","windowId","screenshot","windowNameResult","windowName","trim","replaceAll","parsedMemoryBytes","_ensureDisplayServer","_callee6","_loop2","_ret2","displayNumber","_context8","Error","xvfb","_context7","XVFB_STARTUP_WAIT_SECONDS","_dispose","_callee5","_context6","killed","kill","XVFB_SHUTDOWN_WAIT_SECONDS","_x6","_stopProcess","_callee7","_context9","killProcessGroup","PROCESS_SHUTDOWN_WAIT_SECONDS","processGroupId","result","String","isFinite","reduce","sum","_unused","_unused2","_x7","_pathExists","_callee8","_context0","fs","access","message"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exercode/problem-utils",
3
- "version": "1.8.8",
3
+ "version": "1.9.0",
4
4
  "description": ":100: A set of utilities for judging programs on Exercode (https://exercode.willbooster.com/).",
5
5
  "keywords": [
6
6
  "exercode",
@@ -61,8 +61,8 @@
61
61
  "@tsconfig/node24": "24.0.4",
62
62
  "@types/eslint": "8.56.11",
63
63
  "@types/node": "24.12.0",
64
- "@willbooster/eslint-config-ts": "11.4.12",
65
- "@willbooster/prettier-config": "10.2.4",
64
+ "@willbooster/eslint-config-ts": "11.5.0",
65
+ "@willbooster/prettier-config": "10.3.0",
66
66
  "build-ts": "17.0.24",
67
67
  "conventional-changelog-conventionalcommits": "9.3.1",
68
68
  "dotenv-cli": "11.0.0",
@@ -73,7 +73,7 @@
73
73
  "eslint-plugin-import-x": "4.16.2",
74
74
  "eslint-plugin-sort-class-members": "1.21.0",
75
75
  "eslint-plugin-sort-destructure-keys": "3.0.0",
76
- "eslint-plugin-unicorn": "63.0.0",
76
+ "eslint-plugin-unicorn": "64.0.0",
77
77
  "eslint-plugin-unused-imports": "4.4.1",
78
78
  "globals": "17.4.0",
79
79
  "husky": "9.1.7",