{"id":21846369,"url":"https://github.com/keminghe/osu","last_synced_at":"2026-01-06T23:08:32.129Z","repository":{"id":250978688,"uuid":"836005471","full_name":"KemingHe/OSU","owner":"KemingHe","description":"Unofficial and publicly-available NPM data-package about The Ohio State University.","archived":false,"fork":false,"pushed_at":"2025-06-12T09:01:02.000Z","size":1157,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-14T15:47:16.453Z","etag":null,"topics":["college","data","majors","ohio-state","organizations","public","students","university","unofficial"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/@keminghe/osu","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KemingHe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-31T01:13:20.000Z","updated_at":"2024-09-23T01:14:27.000Z","dependencies_parsed_at":"2024-08-29T21:47:37.951Z","dependency_job_id":"884c6626-b1d1-4729-9ff3-04ec1c8e46b0","html_url":"https://github.com/KemingHe/OSU","commit_stats":null,"previous_names":["keminghe/osu"],"tags_count":3,"template":true,"template_full_name":null,"purl":"pkg:github/KemingHe/OSU","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KemingHe%2FOSU","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KemingHe%2FOSU/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KemingHe%2FOSU/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KemingHe%2FOSU/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KemingHe","download_url":"https://codeload.github.com/KemingHe/OSU/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KemingHe%2FOSU/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266193044,"owners_count":23890716,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["college","data","majors","ohio-state","organizations","public","students","university","unofficial"],"created_at":"2024-11-27T23:13:54.451Z","updated_at":"2026-01-06T23:08:32.124Z","avatar_url":"https://github.com/KemingHe.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ⚠️ [Archived] ⚠️ @keminghe/osu\n\n\u003e [!WARNING]\n\u003e **This repository is archived and no longer maintained.**\n\u003e\n\u003e - **Archived**: 2025-08-10 by [@KemingHe](https://github.com/KemingHe)\n\u003e - **Archive reason**: Low/no demand from the Ohio State community to use this pure data package\n\u003e - **Inquries and corrections**: email [keminghe.career@gmail.com](mailto:keminghe.career@gmail.com)\n\n\u003cdiv align=center\u003e\n  \u003cimg\n    src=\"https://socialify.git.ci/KemingHe/OSU/image?description=1\u0026descriptionEditable=Unofficial%20and%20publicly-available%20NPM%20data-package%20about%20%0AThe%20Ohio%20State%20University.\u0026language=1\u0026name=1\u0026owner=1\u0026theme=Light\"\n    alt=\"Unofficial and publicly-available NPM data-package about The Ohio State University.\"\n    width=\"640\"\n    height=\"320\"\n  /\u003e\n\u003c/div\u003e\n\u003cbr/\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://en.wikipedia.org/wiki/CommonJS\" \u003e\n    \u003cimg\n      src=\"https://img.shields.io/badge/Supports-CommonJS-yellow\"\n      alt=\"supports CommonJS (link to wiki)\"\n    /\u003e\n  \u003c/a\u003e\n  \u003cspan\u003e\u0026nbsp;\u003c/span\u003e\n  \u003ca href=\"https://codecov.io/gh/KemingHe/ECMAScript\" \u003e\n    \u003cimg\n      src=\"https://img.shields.io/badge/Supports-ECMAScript-purple\"\n      alt=\"suports ECMAScript (link to wiki)\"\n    /\u003e\n  \u003c/a\u003e\n  \u003cspan\u003e\u0026nbsp;\u003c/span\u003e\n  \u003ca href=\"https://nodejs.org/en\" \u003e\n    \u003cimg\n      src=\"https://img.shields.io/badge/Supports-node 8.1+-blue\"\n      alt=\"supports node8.1+ (link to nodejs.org)\"\n    /\u003e\n  \u003c/a\u003e\n  \u003cspan\u003e\u0026nbsp;\u003c/span\u003e\n  \u003ca href=\"https://codecov.io/gh/KemingHe/OSU\" \u003e\n    \u003cimg\n      src=\"https://codecov.io/gh/KemingHe/OSU/graph/badge.svg?token=WBJAbAtPTt\"\n      alt=\"dynamic codcov percentage badge\"\n    /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\u003cbr/\u003e\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e **Async** accessors depend on [`jsdom`](https://github.com/jsdom/jsdom) and are `node`-only. For example: `import { getResearchPostingsAsync } from \"@keminghe/osu/async\";`\n\u003e\n\u003e Use import from the **synchronous** `@keminghe/osu` if you are working in a browswer environment.\n\n\u003e [!NOTE]\n\u003e\n\u003e Build by students, for students, with :heart:. **NOT** affiliated by *official* OSU.\n\u003e\n\u003e * Publicly-available *official* data about OSU undergrad majors [here](https://undergrad.osu.edu/majors-and-academics/majors).\n\u003e * Publicly-available *official* data about OSU student orgs [here](https://activities.osu.edu/involvement/student_organizations).\n\n## :gear: Installation\n\nRequires [Node.js](https://nodejs.org/en/download/package-manager) \u003e= **8.1.0** (es2017)\n\n```bash\n# Using npm:\nnpm install @keminghe/osu\n\n# Using yarn:\nyarn add @keminghe/osu\n\n# Using pnpm: (recommended)\npnpm add @keminghe/osu\n```\n\n## :rocket: Quickstart\n\n### Using Validators\n\n```typescript\n// Using OSU email validator functions.\nimport {\n  isNameDotNum,\n  isOSUDotEduEmail,\n  isBuckeyemail,\n  isOSUEmail,\n} from \"@keminghe/osu\";\n\nisNameDotNum(\"buckeye.1\");                      // true\nisOSUDotEduEmail(\"buckeye.1@osu.edu\");          // true\nisBuckeyemail(\"buckeye.1@buckeyemail.osu.edu\"); // true\nisOSUEmail(\"non-osu@gmail.com\");                // false\n```\n\n### Using RegExp Patterns\n\n```typescript\n// Using OSU name dot num and email RegExp patterns.\nimport {\n  NAME_DOT_NUM_PATTERN,\n  OSU_DOT_EDU_EMAIL_PATTERN,\n  BUCKEYEMAIL_PATTERN\n} from \"@keminghe/osu\";\n\nNAME_DOT_NUM_PATTERN.test(\"buckeye.1\");                         // true\nOSU_DOT_EDU_EMAIL_PATTERN.test(\"buckeye.1@osu.edu\");            // true\nBUCKEYEMAIL_PATTERN.test(\"buckeyemail.1@buckeyemail.osu.edu\");  // true\n```\n\n### Accessing All Undergrad Majors\n\n```typescript\nimport { \n  getUndergradMajors, \n  type UndergradMajor,\n  UndergradMajorSchema,\n} from \"@keminghe/osu\";\n\nconst majors: UndergradMajor[] = getUndergradMajors();\nUndergradMajorSchema.array().parse(majors);\nconsole.log(majors);\n```\n\n### Accessing All Student Organizations\n\n```typescript\nimport { \n  getStudentOrgs,\n  type StudentOrg,\n  StudentOrgSchema,\n} from \"@keminghe/osu\";\n\nconst orgs: StudentOrg[] = getStudentOrgs();\nStudentOrgSchema.array().parse(orgs);\nconsole.log(orgs);\n```\n\n### Accessing All Undergrad Research Postings (Async!)\n\n```typescript\nimport { ResearchPostingSchema, type ResearchPosting } from \"@keminghe/osu\";\n\n// IMPORTANT: note the different async import path.\nimport { getResearchPostingsAsync } from \"@keminghe/osu/async\";\n\ngetResearchPostingsAsync()\n  .then((researchPostings) =\u003e {\n    ResearchPostingSchema.array().parse(researchPostings);\n    console.log(researchPostings);\n  })\n  .catch((error) =\u003e {\n    console.error(error);\n  });\n\n// Or use with async/await.\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eDEPRECATED v1.1.0 Documentation\u003c/summary\u003e\n\n### (DEPRECATED v1.1.0) Using Validators\n\n```typescript\nimport { isNameDotNumber, isOSUEmail, isBuckeyemail, isOSUOrBuckeyemail } from \"@keminghe/osu\";\n```\n\n```typescript\nconst flag1 = isNameDotNumber(\"brutus.1\");                    // true\nconst flag2 = isNameDotNumber(\"adams-brown-catlyn.3\");        // true\nconst flag3 = isOSUEmail(\"brutus.1@osu.edu\");                 // true\nconst flag4 = isBuckeyemail(\"brutus.1@buckeyemail.osu.edu\");  // true\nconst flag5 = isOSUOrBuckeyemail(\"non-osu@email.com\");        // false\n```\n\n### (DEPRECATED v1.1.0) Accessing Undergraduate Majors and Degrees\n\n```typescript\nimport osu from \"@keminghe/osu\";\n\nconst majors = osu.undergrad.majors;\nconsole.log(majors);\n```\n\n### (DEPRECATED v1.1.0) Accessing Student Organizations\n\n```typescript\nimport osu from \"@keminghe/osu\";\n\nconst studentOrgs = osu.studentOrgs;\nconsole.log(studentOrgs);\n```\n\n\u003c/details\u003e\n\n## :blue_book: API\n\n### `StudentOrg` Type\n\n```typescript path=src/schemas/StudentOrg.ts\n/**\n * TypeScript type inferred from the `StudentOrg` Zod schema.\n *\n * This type represents the structure of a student organization object as defined by the `StudentOrg` schema.\n *\n * @typedef {Object} StudentOrg\n * @property {string} name - Name of the student organization, represented by a non-empty string.\n * @property {string | null} purposeStatement - Purpose statement of the student organization, represented by a non-empty string, or null if not applicable or missing data.\n * @property {Campus[] | null} campuses - Campuses where the student organization is active, represented by a non-empty array of `Campus` objects, or null if not applicable or missing data.\n * @property {StudentOrgCategory[] | null} categories - Categories of the student organization, represented by a non-empty array of `StudentOrgCategory` objects, or null if not applicable or missing data.\n */\nexport type StudentOrg = z.infer\u003ctypeof StudentOrgSchema\u003e;\n```\n\n### `UndergradMajor` Type\n\n```typescript path=src/schemas/UndergradMajor.ts\n/**\n * TypeScript type inferred from the `UndergradMajor` Zod schema.\n *\n * This type represents the structure of an undergraduate major object as defined by the `UndergradMajor` schema.\n *\n * @typedef {Object} UndergradMajor\n * @property {string} major - Name of the major, represented by a non-empty string.\n * @property {UndergradDegree[] | null} degrees - Array of undergraduate degrees associated with the major, represented by a non-empty array of `UndergradDegree` objects, or null if not applicable or missing data.\n * @property {Campus[] | null} campuses - Campuses where the major is offered, represented by a non-empty array of `Campus` objects, or null if not applicable or missing data.\n * @property {College | null} college - College where the major belongs, represented by a `College` object, or null if not applicable or missing data.\n */\nexport type UndergradMajor = z.infer\u003ctypeof UndergradMajorSchema\u003e;\n```\n\n### `ResearchPosting` Type\n\n```typescript path=src/schemas/ResearchPosting.ts\n/**\n * TypeScript type inferred from the `ResearchPosting` Zod schema.\n *\n * This type represents the structure of a research posting object as defined by the `ResearchPosting` schema.\n *\n * @typedef {Object} ResearchPosting\n * @property {string} title - Title of the research posting, represented by a non-empty string.\n * @property {string} link - URL linking to the research posting, represented by a valid URL string.\n * @property {string | null} applicationDeadline - Application deadline, represented by a non-empty string, or null if not applicable or missing data.\n * @property {string | null} department - Department offering the research posting, represented by a non-empty string, or null if not applicable or missing data.\n * @property {string | null} publicOrPrivate - Indicates whether the posting is public or private, represented by a non-empty string, or null if not applicable or missing data.\n * @property {string | null} hoursPerWeek - Number of hours per week required, represented by a non-empty string, or null if not applicable or missing data.\n * @property {string[] | null} compensationTypes - Types of compensation offered, represented by a non-empty array of non-empty strings, or null if not applicable or missing data.\n */\nexport type ResearchPosting = z.infer\u003ctypeof ResearchPostingSchema\u003e;\n```\n\n## :key: License\n\nUsage indicates agreement with the **MIT** license. [More Info.](https://mit-license.org/)\n\n## :seedling: Community\n\n![Alt](https://repobeats.axiom.co/api/embed/918a96fb67e64cd9979c35e7bfbd51dd9417e11e.svg \"Repobeats analytics image\")\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeminghe%2Fosu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkeminghe%2Fosu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkeminghe%2Fosu/lists"}